Skip to content

Instantly share code, notes, and snippets.

@YusukeHirao
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YusukeHirao/67da6a51b676b6add822 to your computer and use it in GitHub Desktop.
Save YusukeHirao/67da6a51b676b6add822 to your computer and use it in GitHub Desktop.
JavaScriptでのサロゲートペア文字列のメモ ref: http://qiita.com/YusukeHirao/items/2f0fb8d5bbb981101be0
// シングルクォートとダブルクォートの差はない
"\u3042"; // => "あ"
'\u3042'; // => "あ"
// 正規表現リテラルでも表現可能
/\u3042/.test('あ'); // => true
// 10進数の参照 (戻り値型: number)
'あ'.charCodeAt(0); // => 12354
// 16進数の参照 (戻り値型: string)
'あ'.charCodeAt(0).toString(16); // => "3042"
// シンプルに書くとこう
// ※String.fromCodePointに似せるなら可変長引数に対応する必要あり
function stringFromCodePoint (codeNum) {
var cp = codeNum - 0x10000;
var high = 0xD800 | (cp >> 10);
var low = 0xDC00 | (cp & 0x3FF);
return String.fromCharCode(high, low);
}
stringFromCodePoint(0x29E3D); // => "𩸽"
function stringToArray (str) {
return str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
}
stringToArray('𩸽のひらき'); // => ["𩸽", "の", "ひ", "ら", "き"]
stringToArray('𩸽のひらき').length; // => 5
stringToArray('𩸽のひらき').length; // => 5
stringToArray('𩸽のひらき')[0]; // => "𩸽"
stringToArray('𩸽のひらき')[1]; // => "の"
// 10進数から参照
String.fromCharCode(12354); // => "あ"
// 16進数から参照 数値の16進数リテラルを利用すれば可能
String.fromCharCode(0x3042); // => "あ"
'\uD867\uDE3D'; // => "𩸽"
'\u29E3D'; // => "⧣D"
'𩸽'.length; // => 2
console.log('𩸽'.split('')); // => ["�", "�"]
'𩸽のひらき'.charAt(1); // => "�"
'𩸽のひらき'[2]; // => "の"
'𩸽のひらき'.slice(1, 4); // => "�のひ" ※表示媒体によっては下位サロゲート以降の文字が表示されない
String.fromCodePoint(0x29E3D); // => "𩸽"
"\u{29E3D}"; // => "𩸽"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment