文字分解 unicode 忘備録

特殊文字を分解することになったので,unicodeの調査

コンピュータは直接テキストを扱うことができません。彼らは数しか扱えない。コンピュータ内でテキスト(文字列)を(文字列)数として表現するには、文字から数へのマッピングを指定します。これはエンコーディングと呼ばれます。

エンコードのことですね。

最もよく知られている文字エンコーディングはASCIIです。ASCIIは、英語のアルファベット、0〜9の数字、句読点および制御文字を0〜127の整数にマップする7ビットコードです。その後、さまざまな8ビットエンコーディングが作成され、コンピュータが他の言語でも動作するようになりました。英語。それらは主にASCIIに基づいており、追加の文字、記号、またはアルファベット全体(キリル文字やギリシャ文字など)をエンコードするために未使用の8ビット目を利用していました。

初期は8ビットで足りたということだね

unicodeはこちらで調べられるらしい

Code Charts

正規化フォーム

我々は、文字列の等価性がUnicodeの単純な概念ではないことを見ました。コードポイントとコードポイントの2つの文字列を比較する以外に、正規の等価性または互換性の等価性をテストする方法も必要です。ユニコードはこれのためにいくつかの正規化アルゴリズムを定義します。文字列を正規化することは、それを等価な文字シーケンスの一意の表現を保証する形式に変換することを意味します。その結果、文字列を別の正規化文字列とバイナリ比較することができます。

Unicode標準には、C、D、KD、およびKCというラベルの付いた4つの正規化形式があります。これらは、2行2列の行列に配置できます(NSString正規化を実行するメソッドもリストしました)。

UTF-16と代理ペアの概念

UTF-16はもっと一般的であり、これから見るように、NSStringのUnicode実装の議論に非常に関連があります。これは、16ビットの固定幅を持つ、いわゆるコード単位で定義されています。UTF-16自体は可変幅エンコーディングです。BMPの各コードポイントは、1つのコード単位に直接マッピングされています。BMPはほとんどすべての共通文字を網羅しているので、UTF-16は通常UTF-32の半分のメモリしか必要としません。他のプレーンではめったに使用されないコードポイントは、2つの16ビットコードユニットでエンコードされます。一緒に1つのコードポイントを表す2つのコード単位は、サロゲートペアと呼ばれます。

UTF-16でエンコードされた文字列のあいまいなバイトシーケンスを回避し、サロゲートペアを簡単に検出できるようにするため、Unicode規格ではUTF-16の使用のためにU + D800からU + DFFFまでの範囲を予約しています。この範囲のコードポイント値には文字が割り当てられません。プログラムがUTF-16文字列でこの範囲に入るビットシーケンスを検出すると、サロゲートペアの一部に遭遇したことがすぐにわかります。実際のエンコーディングアルゴリズムは単純です、そしてあなたはUTF-16のためのウィキペディアの記事でそれについてもっと読むことができます。UTF-16の設計も、コードポイントの21ビット範囲が奇妙に見える理由です。U + 10FFFFは、この方式でエンコードできる最大値です。

最初の2バイトを調べれば、バイトオーダーを識別できる

すべてのマルチバイトエンコーディングスキームと同様に、UTF-16(およびUTF-32)もバイト順に注意する必要があります。メモリ内の文字列の場合、ほとんどの実装は当然それらが実行されるCPUのエンディアンを採用します。ディスクへの保存やネットワーク上での転送のために、UTF-16は実装が文字列の先頭にByte Order Mark(BOM)を挿入することを可能にします。BOMは値U + FEFFを持つコード単位であり、ファイルの最初の2バイトを調べることによって、デコードマシンはそのバイトオーダーを認識できます。BOMはオプションであり、標準ではデフォルトとしてビッグエンディアンのバイトオーダーを規定しています。バイトオーダーを指定する必要性によってもたらされる複雑さは、OS XとWindowsの両方が内部的にそれを使用するけれども、UTF-16がファイルフォーマットまたはネットワーク上の伝送のための一般的なエンコーディングではない理由の1つです。

文字列をまずlengthで求める

文字列オブジェクトはそれ自身をUnicode文字の配列として表します…。lengthメソッドを使用して文字列オブジェクトに含まれる文字数を決定し、メソッドを使用して特定の文字を取得できますcharacterAtIndex:。これら2つの「プリミティブ」メソッドは、文字列オブジェクトへの基本的なアクセスを提供します。

ただその場合は é  は2文字としてカウントされてしまう。

NSString *s = @"e\u0301"; // e + ´
NSLog(@"The length of %@ is %lu", s, [s length]);
// => The length of é is 2

 文字シーケンスの結合:éがその分解形式(e + ´)でエンコードされている場合、2つのコード単位としてカウントされます。

precomposedStringWithCanonicalMappingを使用すると実際の文字数を把握できる。

NSString *n = [s precomposedStringWithCanonicalMapping];
NSLog(@"The length of %@ is %lu", n, [n length]);
// => The length of é is 1

参考サイト

https://www.objc.io/issues/9-strings/unicode/

Ruby で文字列の Unicode コードポイント

参考サイト これでめどが付きました。

Ruby で文字列の Unicode コードポイントと \uXXXX 表記用の 16 進数を得る - @kyanny's blog

めでたし、めでたし