SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

突然ですがクイズです!(AD)

突然ですがクイズです!-その1

Delphi、C++、Java、C#、PHP、Rubyの6言語の動作の違いをクイズで考察

  • X ポスト
  • このエントリーをはてなブックマークに追加

文字の長さ

問題

 続いて文字の長さについて。6つの言語で「あ」の長さを取得してみました。しかし、やはり1つだけ出力結果が違うものがありました。それはどれでしょうか?

 それぞれ、ソースファイルの文字コードやコンパイルオプションなどは正しく設定されているハズなのですが…。

Delphi for Win32 - ソースコードはSJISで保存
program Project1;
{$APPTYPE CONSOLE}
var
  str: WideString;
begin 
  str := 'あ';
  Write(Length(str));
end.
C++Builder - ソースコードはSJISで保存
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
  wstring str = L"あ";
  cout << str.length();
  return 0;
}
Java - ソースコードはUTF-8で保存
package project1;
public class Project1 {
  public static void main(String[] args) {
     String str = "あ";
     System.out.print(str.length());
  }
}
C#.NET - ソースコードはSJISで保存
namespace project1 {
public class Project1 {
  public static void Main() {
    string str = "あ";
    System.Console.Write(str.Length);
  }
}
}
PHP5 - ソースコードはUTF-8で保存
<?php
ini_set('mbstring.internal_encoding', 'UTF-8');
$str = 'あ';
echo mb_strlen($str);
?>
Ruby1.8.6 - ソースコードはUTF-8で保存
$KCODE='u'
str = 'あ'
print str.length
解説

 正解は「Ruby」。

 Rubyでは、期待した「1」ではなく「3」が出力されます。それ以外の言語では正しく「1」が出力されます。Delphi/C++/Java/C#では基本的に1文字を16bitのUnicodeで管理することが可能です。特にうっかりミスを起こすことはないでしょう。

 PHPでは、文字を処理する際のエンコード(UTF-8やSJISなど)を設定することができます。問題のコードでは、UTF-8でエンコードされた「あ」をmb_strlen関数を利用して正しく1文字として認識しています。しかし、Rubyでは文字列の長さを取得するlengthメソッドはUTF-8に対応しておらず、バイト単位のサイズが返されます。そのため「3」が出力されました。

 そこでRubyでは、以下に示すコードのようにUTF-8に対応したライブラリ「jcode」または「RailsのActiveSupport」を利用することで正しく「1」が出力されます。

jocdeのjlengthを使用した例
require 'jcode'
$KCODE='u'
str = 'あ'
print str.jlength
RailsのActiveSupportを使用した例
require 'rubygems' 
require 'active_support'
$KCODE='u'
str = 'あ'
print str.chars.length

次のページ
文字列の足し算と比較

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
突然ですがクイズです!連載記事一覧
この記事の著者

EDN編集部(イーディーエヌ編集部)

エンバカデロ・デベロッパーネットワーク(EDN)は、ソフトウェア開発者とデータベース技術者のための技術情報サイトです。Delphi、C++Builderをはじめとする開発ツールやER/Studioなどのデータベースツールに関連する技術記事、ビデオなどを提供しています。EDN編集部は、EDN記事と連携...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2289 2008/08/20 13:35

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング