Jon Skeet のブログで、文字列の反転について語っているこの投稿を見ました。彼が自分で示した例を試してみたかったのですが、うまくいくようです...実際に文字列の反転を失敗させるサロゲートペアを含む文字列を作成する方法がわからない. 自分で失敗を確認できるように、サロゲート ペアを含む文字列を実際に作成するにはどうすればよいでしょうか。
2 に答える
最も簡単な方法は、が大文字で\U########
ある場所を使用することであり、は正確に 8 桁の 16 進数を示します。値が16 進数を超える場合は、サロゲート ペアが必要になります。U
#
0000FFFF
string myString = "In the game of mahjong \U0001F01C denotes the Four of circles";
myString.Length
1 つの Unicode 文字が 2 つの .NETChar
値を占めていることを確認できます。このchar
型には、a がサロゲート ペアの一部であるstatic
かどうかを判断するのに役立ついくつかのメソッドがあることに注意してください。char
\U########
エスケープ シーケンスのようなものを持たない .NET 言語を使用する場合は、メソッドを使用できますConvertFromUtf32
。次に例を示します。
string fourCircles = char.ConvertFromUtf32(0x1F01C);
追加: C# ソース ファイルに、UTF-8 などのすべての Unicode 文字を許可するエンコーディングがある場合は、(コピーして貼り付けて) 文字を直接ファイルに入れることができます。例えば:
string myString = "In the game of mahjong denotes the Four of circles";
文字はソース ファイルでは UTF-8 でエンコードされていますが (私の例では)、アプリケーションが実行され、文字列がメモリにある場合は UTF-16 でエンコードされます (サロゲート ペア)。
(スタック オーバーフロー ソフトウェアが私の麻雀キャラクターを正しく処理しているかどうかはわかりません。「面白い」キャラクターがここにない場合は、この回答の [編集] をクリックして、そこのテキストからコピー アンド ペーストしてみてください。)
UTF-16
「サロゲート ペア」という用語は、エンコード スキームで高いコード ポイントを持つ Unicode 文字をエンコードする手段を指します (詳細については、このページを参照してください)。
Unicode
文字エンコーディングでは、文字は ~ の間の値にマッピングされ0x000000
ます0x10FFFF
。内部的には、2 バイト ( ) コード シーケンスが考慮されるテキストUTF-16
の文字列を格納するためにエンコード スキームが使用されます。2 バイトには からまでの範囲の文字のみを含めることができるため、この範囲 (から) を超える値を格納するには、さらに複雑さが加えられます。Unicode
16-bit
0x0000
0xFFFF
0x010000
0x10FFFF
これは、サロゲートと呼ばれるコード ポイントのペアを使用して行われます。サロゲート文字は、2 つのコード シーケンスの最初または最後で使用できるかどうかに応じて、low surrogates
およびとして知られる 2 つの異なる範囲に分類されます。high surrogates
これを自分で試してください:
String surrogate = "abc" + Char.ConvertFromUtf32(Int32.Parse("2A601", NumberStyles.HexNumber)) + "def";
Char[] surrogateArray = surrogate.ToCharArray();
Array.Reverse(surrogateArray);
String surrogateReversed = new String(surrogateArray);
またはこれ、ブログの例に固執したい場合:
String surrogate = "Les Mise" + Char.ConvertFromUtf32(Int32.Parse("0301", NumberStyles.HexNumber)) + "rables";
Char[] surrogateArray = surrogate.ToCharArray();
Array.Reverse(surrogateArray);
String surrogateReversed = new String(surrogateArray);
nnd は、デバッガーで文字列値をチェックします。Jon Skeet の言うとおりです...文字列と日付は簡単に見えますが、絶対にそうではありません。