[追記]JavaScriptには\uXXXXがあるんですよ

[追記]JavaScriptには\uXXXXがあるんですよ

[追記]404 Blog Not Found:javascript - \uXXXXを使わない理由を受けて追記

dankogaiさんはあまりJavaScriptのリテラルに詳しくないのかな?

404 Blog Not Found:regexp - 全角英数字を半角に

var fascii2ascii = (function(){
  var cclass
   = '['+String.fromCharCode(0xff01)+'-'+String.fromCharCode(0xff5e)+']';
  var re_fullwidth = new RegExp(cclass, 'g');
  return function(s){
    return s.replace(re_fullwidth, function(m){
      return String.fromCharCode(m.charCodeAt(0) - 0xfee0); // 0xff00 - 0x20
    });
  }
})();

こんなエントリを書いたとおり、JavaScriptでは\uXXXXの文字表現が使えます。

おそらく、

'['+String.fromCharCode(0xff01)+'-'+String.fromCharCode(0xff5e)+']'

の意図するところは、

'[\uFF01-\uFF5E]'

でしょう。だとするならば、

new RegExp(cclass, 'g')

は、

/[\uFF01-\uFF5E]/g

で十分です。

danさんの書いた関数は、一般的には

var fascii2ascii = function(s) {
    return s.replace(/[\uFF01-\uFF5E]/g, function(m) {
        return String.fromCharCode(m.charCodeAt() - 0xFEE0);
    });
};

で済むものです。

それでもわざわざ(function() {})()でくくっているのは、正規表現オブジェクトを繰り返し初期化するのを避けるためでしょう。

だとするならば、

var fascii2ascii = (function() {
    var pattern = /[\uFF01-\uFF5E]/g, replace = function(m) {
        return String.fromCharCode(m.charCodeAt() - 0xFEE0);
    };
    return function(s) { return s.replace(pattern, replace); };
})();

のように、置換に使う関数オブジェクトもあらかじめ初期化しておかなければ効果は半減です。

[追記]404 Blog Not Found:javascript - \uXXXXを使わない理由を受けて追記

404 Blog Not Found:javascript - \uXXXXを使わない理由

これがある限り\uXXXXは使うべきではないと考えている。BMPしか扱えない\uXXXXは、JavaScriptがJavaから受け継いだ Bad Legacy だ。

なるほど。サロゲート・ペア問題を考慮して\uXXXX表現を使わない主義だったのか。全角英数を半角英数に変換するという問題のスコープを考えれば\uXXXXでもいいような気はするが、そういう思想があってのことなら、議論すべきことでもないので気にしないことにする。

BMPしか扱えない\uXXXXはBad legacyだという点は激しく同意。JavaScriptのサロゲート・ペア問題はどうにかならないかといつも思っていた。これは\uXXXX表現に限らず、JavaScriptの文字列の内部表現に問題がある。そもそもECMAScriptの仕様書に、

Ecma-262 p.5

A string value is a member of the type String and is a finite ordered sequence of zero or more 16-bit unsigned integer values.

と書かれてしまっていて、16ビット以上の長さの文字を格納できない。だから、↓みたいなことが起こるんだね。

var s = "𪚲";                // U+2A6B2

console.log(s.length);       // 2
console.log(s.split(""));    // ["�", "�"]

JavaScriptを使い始めたときは、日本語とASCIIを同じように扱えることに感動したもんだけど、最近はなぜ内部表現にUCS4を使わなかったのかが疑問でしょうがない。

スポンサーサイト



関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/72-65852e20

トラックバック

javascript - \\uXXXXを使わない理由
そんなことは、ない。 JavaScriptには\\uXXXXがあるんですよ[文系大学的IT系の悲哀] dankogaiさんはあまりJavaScriptのリテラルに詳しくないのかな? \\uXXXXを使わないのは、訳がある。
  • 2008-01-14
  • 発信元: 404 Blog Not Found

コメント

UCS4なら固定長であっても将来的に拡張は不要なんでしょうか? perlは文字の内部表現を可変長のutf8(not UTF-8)にすることでこの問題から決別できましたが。
  • 2008-01-14
  • by tateisu
  • id:-
言われてみればそうですね。
ただ、unicodeが現在21bitで、UCS-4が32bit固定長であることを考えると、もうしばらくは大丈夫そうですけど。
それから、サロゲート・ペアを使うUTF-16もある意味ではutf8と同じ可変長なわけで、問題は可変長コードの処理をどのレイヤーでやるかという点のような気もします。ECMAScriptはサロゲート・ペアの処理を言語処理系がやってくれるんじゃなくて、プログラマがやらなければいけない点が一番の問題でないかと思います。処理系レベルで可変長を処理してくれればどのUTFでもよさそうな気がしますし。

詳しいことはあまりわかりませんが…
  • 2008-01-15
  • by LiosK
  • id:-

コメントの投稿

お名前
コメント
編集キー