[ruby-dev:31745] Re: string literal encoding

From: Nobuyoshi Nakada <nobu@...>
Date: 2007-09-06 06:43:45 UTC
List: ruby-dev #31745
なかだです。

At Mon, 3 Sep 2007 16:34:12 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:31723]:
> |JRubyでは、Unicode系以外の文字列はどういう方針になるんでしょうか。
> |なんとなく、binaryについてはbyte arrayという話を見掛けたような気
> |もするんですが。
> 
> JRubyでは基本的に内部コードに変換するポリシーになると思いま
> す。で、バイナリが必要な場合には明示的にバイナリと指定するの
> だと思います。内部的に実装を切り替える(通常文字列はJavaの
> Stringを使用、バイナリ文字列はbyte array。表面的には同じクラ
> スに見える)と聞いています。

つまり、指定されていない限りASCIIのみの文字列にもUTF-16を使うと
いうことでしょうか。

> |もしすべてUTF-16で実装するなら、String#encodingは常に"UTF-16"を
> |返すんでしょうか。
> 
> そうだと思います。
> 
> |それならそれでcoding:で指定したものとは一致す
> |るとは限らないわけで、気にすることはないようにも思えます。
> 
> codingで指定したものと一致しないのはそれはそれで構わないので
> すが、「ASCIIしか含まないものはASCII(≒バイナリ)という仕様」
> はJRuby的に取り込みにくいんじゃないでしょうか。UTF-8と違って、
> 通常文字列(UTF-16)とバイナリ文字列(ASCII)の互換性を維持する
> のが困難だと思いますから。

JRuby的には「ASCII≠バイナリ」ということでいいんじゃないでしょう
か。もしそうであれば、ASCIIのみでも非ASCIIを含んでいても文字列リ
テラルは常にJava Stringで、結合や比較は問題なく行えるはずです。
逆に「ASCII(≒バイナリ)=byte array」ということであれば、そういっ
たbyte array/Java String間の変換は、リテラルに限らずしばしば必要
になるはずで、リテラルについてだけ気にしてもしょうがないと思いま
す。

妥協点として、「ASCIIしか含まないものはencoding="ASCII"」まで規
定せずに、「リテラルのencodingは最大公約数的なものを使う」くらい
でどうでしょうか。ASCIIベースの実装ならASCII/binary、UTF-16ベー
スならUTF-16ベース。でないと実際にはかえって不便でしょうがなくな
ると思うのですが。

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread