Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unicodeと符号化形式

 Unicodeと符号化形式

kamijin_fanta

July 26, 2021
Tweet

More Decks by kamijin_fanta

Other Decks in Technology

Transcript

  1. Before Unicode アメリカ: ASCII 西ヨーロッパ: Laten-1 日本: JIS X 0208

    (Shift JIS, EUC-JP) IBM,NEC PC98が勝手に拡張した文字を統合→CP932(Windows-31J) 中国: GB 2312-80 (EUC-CN) 後のGB 18030が国家規格として採用・中国で対応が必須に 台湾: CCCII (EUC-CCCII-FT) 他にBigFive,CNS 11643等も存在 韓国: KS X 1001 (EUC-KR) 北朝鮮: KPS 9566 (EUC-KP) ベトナム: TCVN (EUC-VN) 1980年代に言語/ベンダによって異なる文字コードが定義され普及した
  2. 文字コードの大まかな種類 符号化文字集合 / CCS (Coded Character Set) 文字の集合に番号を振ったもの JIS X

    0208 ("桜"は"26区89点") Unicode ("桜"は"U+685C") 文字符号化方式 / CES (Coded Encoding Scheme) コンピュータ内での表現方法 Shift JIS, EUC-JP UTF-8, UTF-16 https://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0208.html https://unicode-table.com/en/685C/
  3. UCS-4 (Universal multi-octet Character Set 4) 1文字を31bitで表現 128群(group), 256面(plane), 256区(row),

    256点(cell) で20億種 UCS-2 (Universal multi-octet Character Set 2) 1文字を16bitで表現 0群(group), 0面(plane) の65,535種 一般的に利用される文字はUCS-2にほぼ収録 歴史 当初UnicodeはUCS-2にすべての文字を収録する予定だったが、文字数の限 界が有りUCS-4に一般的でない文字を収録 UCS-2で収録された文字はBMP(Basic Multilingual Plane / 基本多言語面)と 呼ばれるように
  4. UTF-16 UCS-2の置き換えとして定義 基本的には16bitで表現 UCS-2(BMP)に無くUCS-4に収録されている文字 U+10000 ~ U+10FFFF を 「サロゲートペア」として32bitで表現 UTF-16の符号化

    スカラ値 | UTF-16 | 備考 -------------------------- | ----------------------------------- | --------- xxxxxxxx xxxxxxxx | xxxxxxxx xxxxxxxx | BMPはそのまま表現 000uuuuu xxxxxxxx xxxxxxxx | 110110ww wwxxxxxx 110111xx xxxxxxxx | wwww = uuuuu - 1 BMPで表現できず連続した16bit符号2つで表されるペアをサロゲートペアと呼ぶ
  5. Unicode関連の用語 コードポイント 任意のUnicodeコードポイント 範囲は U+0 ~ U+10FFFF16 Surrogate Code Point

    UTF-16のサロゲートペアに使うコードポイント High-Surrogate Code Point: U+D800 ~ U+DBFF Low-Surrogate Code Point: U+DC00 ~ U+DFF Unicode スカラ値 一部の予約されたコードポイント以外の任意のUnicodeコードポイント U+1234 で表現 範囲は U+0 ~ U+D7FF16 U+E00016 ~ U+10FFFF16
  6. Oracleしか使っていないので理解する必要はないし、今となってはOracleも使わ ないほうが良いと言っている Oracle DatabaseではCESU-8を UTF-8 , 一般的なUTF-8を AL32UTF8 として 扱う

    MySQLも文字コードを utf8 と指定するとCESU-8が利用され、通常のUTF- 8を utf8mb4 として扱う アレな実装をOracleが使い始めて規格化してしまった https://docs.oracle.com/cd/F19136_01/nlspg/supporting-multilingual- databases-with-unicode.html#GUID-F3B0B4F7-B6D9-473D-840F- F98998F37981
  7. プログラミング言語とUnicode UTF-8のString型 Rust, Elixir, Julia, Swift 任意バイト列を文字列として扱う・解釈はライブラリに任される C, C++, Go,

    Rua, PHP , Zig 任意バイト列・エンコーディングを別に持つ Ruby (CSI正規化・デフォルトはUTF8) UTF-16のString型 16bit整数の配列: JavaScript, Java, C# Unicodeコードポイントの配列: Python
  8. 参考資料1 .NETでの文字エンコード https://docs.microsoft.com/ja- jp/dotnet/standard/base-types/character-encoding-introduction JS Primer 文字列とUnicode https://jsprimer.net/basic/string-unicode/ utf8 rcf

    1998 https://tools.ietf.org/html/rfc2279 2003 https://tools.ietf.org/html/rfc3629 What is the maximum number of bytes for a UTF-8 encoded character? https://stackoverflow.com/questions/9533258/what-is-the-maximum-number- of-bytes-for-a-utf-8-encoded-character 結合文字 (NFC,NFD) https://tama-san.com/combining_character_sequence/