JavaScript/String/fromCharCode
fromCharCodeメソッドは0x41, 0x42, 0x43
のような文字コード列を "ABC"
のような文字列に変換して返します。このメソッドはECMA-262第1版で規定され、JavaScript 1.2で実装されました。JavaScript 1.3以降は引数をISO/IEC 8859-1のバイト表現ではなく、Unicodeのバイト表現として扱うように変更されています。逆に "A"
のような文字を0x41
のような文字コードに変換するには、String.prototype.charCodeAtメソッドを使用します。
構文
[編集]var string = String.fromCharCode( number0, number1, ..., numberN );
引数
[編集]- number0, number1, ..., numberN
- Unicodeの文字コード値のリスト(
0x0
以上0xFFFF
未満)
例
[編集]var string = String.fromCharCode( 0x41, 0x42, 0x43 );
alert(string); // "ABC"
解説
[編集]fromCharCodeメソッドはUnicodeの文字コード(バイト表現)の数値のリストを受け取り、それらを文字に変換して連結した文字列を返します。これは文字列リテラルのUnicodeエスケープシーケンスと同じ働きをします。たとえば、"\u3000"
とString.fromCharCode(0x3000)
は等価です(さらに "\x41"
はString.fromCharCode(0x41)
と等価)。fromCharCodeメソッドはStringオブジェクトの静的なメソッドであり、Stringオブジェクトのインスタンスには継承されないので、必ずString.fromCharCode
という形で呼び出す必要があります。
たとえば "A"
から "Z"
までのラテン文字を要素に持つ配列は、次のようにfromCharCodeメソッドを使用して生成することができます。
var array = [];
for ( let c = 'A'; c <= 'Z';
array.push(c), c = String.fromCharCode( c.charCodeAt(0) + 1 ) );
alert(array); // ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
または
var array = [];
for ( let i = 0, a = 'A'.charCodeAt(0); i < 26;
array.push( String.fromCharCode( a + i++ ) ) );
alert(array); // ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
fromCharCodeメソッドはECMAScriptの仕様上および多くのJavaScriptの処理系の実装では、0x10000 == 65536
以上の文字コードの値(サロゲートペア)には対応していません('\0'
が返されます)。これはUnicodeエスケープ文字やその他の文字列を扱うメソッドでも同様です。fromCharCodeメソッドでサロゲートペアの文字コードを扱うには、次のような非標準の拡張を使用します。
String.__fromCharCode__ = String.fromCharCode;
String.fromCharCode = function(...args){
var buf = '';
for ( let i = 0, len = args.length; i < len; i++ ) {
let n = args[i];
if ( n < 0x10000 ) {
buf += String.__fromCharCode__(n);
continue;
}
n -= 0x10000;
buf += String.__fromCharCode__(
0xD800 + ( n >> 10 ),
0xDC00 + ( n & 0x3FF )
);
}
return buf;
};
String.fromCharCode(0x10000) == '\uD800\uDC00'; // true
String.fromCharCode(0x10FFFF) == '\uDBFF\uDFFF'; // true