JavaScriptの文字列は内部的にはUCS-2の2バイトで表現されるため、そのまま文字単位に切り出したものをURLパラメータの%形式などに変換しても、他では使えません。なので、一旦UTF-8に変換してから処理を行う必要があります。
このプログラムでは、文字列を1バイトづつの配列に変換します。
【サンプル】
(function(text) {
var result = [];
if (text == null)
return result;
for (var i = 0; i < text.length; i++) {
var c = text.charCodeAt(i);
if (c <= 0x7f) {
result.push(c);
} else if (c <= 0x07ff) {
result.push(((c >> 6) & 0x1F) | 0xC0);
result.push((c & 0x3F) | 0x80);
} else {
result.push(((c >> 12) & 0x0F) | 0xE0);
result.push(((c >> 6) & 0x3F) | 0x80);
result.push((c & 0x3F) | 0x80);
}
}
return result;
})('今日はいい天気です');
【サンプルの実行】 → クリックしてください
今度は、上記で生成したバイト配列を元の文字列に戻します。
【サンプル】
(function(arr) {
if (arr == null)
return null;
var result = "";
var i;
while (i = arr.shift()) {
if (i <= 0x7f) {
result += String.fromCharCode(i);
} else if (i <= 0xdf) {
var c = ((i&0x1f)<<6);
c += arr.shift()&0x3f;
result += String.fromCharCode(c);
} else if (i <= 0xe0) {
var c = ((arr.shift()&0x1f)<<6)|0x0800;
c += arr.shift()&0x3f;
result += String.fromCharCode(c);
} else {
var c = ((i&0x0f)<<12);
c += (arr.shift()&0x3f)<<6;
c += arr.shift() & 0x3f;
result += String.fromCharCode(c);
}
}
return result;
})([228, 187, 138, 230, 151, 165, 227, 129, 175, 227, 129, 132, 227, 129, 132, 229,
164, 169, 230, 176, 151, 227, 129, 167, 227, 129, 153]);
【サンプルの実行】 → クリックしてください
JavaScriptコードスニペットへ