我已阅读a question about UTF-8, UTF-16 and UCS-2,几乎所有答案都说明UCS-2已过时且C#使用UTF-16。
但是,我在C#中创建4字节字符U + 1D11E的所有尝试都失败了,所以我实际上认为C#仅使用UTF-16的UCS-2子集。
有我的尝试:
string s = "\u1D11E"; // gives the 2 character string "ᴑE", because \u1D11 is ᴑ
string s = (char) 0x1D11E; // won't compile because of an overflow
string s = Encoding.Unicode.GetString(new byte[] {0xD8, 0x34, 0xDD, 0x1E}); // gives 㓘ờ
C#字符串真的是UTF-16还是它们实际上是UCS-2?如果它们是UTF-16,我怎样才能将小提琴谱号放入我的C#弦中?
答案 0 :(得分:15)
使用大写U代替:
string s = "\U0001D11E";
你忽略了大多数机器都是小端的:
string t = Encoding.Unicode.GetString(new byte[] { 0x34, 0xD8, 0x1E, 0xDD });
答案 1 :(得分:5)
C#绝对使用UTF-16。在U + 0000 - U + FFFF范围之上定义字符的正确方法是使用允许使用8个十六进制数字定义字符的escape sequence:
string s = "\U0001D11E";
如果您使用\u1D11E
,则会将其解释为U+1D11
字符后跟E
。
使用这些字符时要记住的一件事是String.Length property和大多数字符串方法适用于UTF-16代码单元,而不是Unicode字符。来自MSDN文档:
Length属性返回此实例中的Char对象数,而不是Unicode字符数。原因是Unicode字符可能由多个Char表示。使用
System.Globalization.StringInfo
类来处理每个Unicode字符而不是每个Char。
答案 2 :(得分:2)
根据C#规范,使用\U
(大写U)和8个十六进制字符编码超过4个十六进制字符长度的字符。一旦在字符串中正确编码,就可以使用任何unicode编码正确导出;
string s = "\U0001D11E";
foreach (var b in Encoding.UTF32.GetBytes(s))
Console.WriteLine(b.ToString("x2"));
Console.WriteLine();
foreach (var b in Encoding.Unicode.GetBytes(s))
Console.WriteLine(b.ToString("x2"));
> 1e
> d1
> 01
> 00
>
> 34
> d8
> 1e
> dd