JavaScript の文字コードは UTF-16 だった
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ たまにコードでみかける \u3042 とかって UTF-16 ですよね
◆ 日本語でも文字列の長さが一緒なのは何かしてくれてるんじゃなくて仕様だった
◆ 最近みかける 4 バイト文字で問題が?
◆ 日本語でも文字列の長さが一緒なのは何かしてくれてるんじゃなくて仕様だった
◆ 最近みかける 4 バイト文字で問題が?
そういえば JavaScript の内部の文字コードって UTF-8 じゃなくて UTF-16 なんですね
ソースコードは UTF-8 で書きますし たいていのものは UTF-8 なので UTF-8 だろうと勝手に思ってました
ですが よく考えると
↑は「あいうえお」を unicode の文字コードにエスケープして書いたものです
半角だけにしたいからなのか ツールで JSON 出力するときなどにみかけます
JavaScript として評価すると普通の文字列 "あいうえお" になってます
「あ」が \u3042 なわけですが 全角文字なのに 3 バイトじゃなくて 2 バイトですよね
(16 進数が 4 桁なので 4 bit × 4 桁 = 16 bit = 2 byte)
「a」 は \u0061 ですので 半角なのに 2 バイトです
半角も全角も 2 バイト つまり UTF-16 です
普段から \u3042 形式は見たり使ったりするのに全然気づいてませんでした……
そう考えると JavaScript で半角も全角も一文字は一文字として扱ってくれるのも納得できます
いままで内部で半角の文字(1 バイト)か全角の文字(3 バイト)かで判断したうえで適切に 文字数カウントしてくれてると思ってたのに何も考えず半角だろうと全角だろうと一緒で文字数計算してたんですね
他の言語みたいに全角あるときに特別なこと考える必要ないので良いといえば良い方法です
でも 結局最近の 4 バイト文字のせいで文字数計算がずれてますけどね
ソースコードは UTF-8 で書きますし たいていのものは UTF-8 なので UTF-8 だろうと勝手に思ってました
ですが よく考えると
var a = "\u3042\u3044\u3046\u3048\u304a"
と書いてるのをみることがあります↑は「あいうえお」を unicode の文字コードにエスケープして書いたものです
半角だけにしたいからなのか ツールで JSON 出力するときなどにみかけます
JavaScript として評価すると普通の文字列 "あいうえお" になってます
「あ」が \u3042 なわけですが 全角文字なのに 3 バイトじゃなくて 2 バイトですよね
(16 進数が 4 桁なので 4 bit × 4 桁 = 16 bit = 2 byte)
「a」 は \u0061 ですので 半角なのに 2 バイトです
半角も全角も 2 バイト つまり UTF-16 です
普段から \u3042 形式は見たり使ったりするのに全然気づいてませんでした……
そう考えると JavaScript で半角も全角も一文字は一文字として扱ってくれるのも納得できます
いままで内部で半角の文字(1 バイト)か全角の文字(3 バイト)かで判断したうえで適切に 文字数カウントしてくれてると思ってたのに何も考えず半角だろうと全角だろうと一緒で文字数計算してたんですね
他の言語みたいに全角あるときに特別なこと考える必要ないので良いといえば良い方法です
でも 結局最近の 4 バイト文字のせいで文字数計算がずれてますけどね
"😉".length // 2
;[..."😉"].length // 1
いったん配列化しないで 4 バイト文字あっても文字数求める方法ってあるのかな;[..."😉"].length // 1