5

我在外星人编码系统中有一个输入字符串,即: "\\U+1043\\U+1072\\U+1073\\U+1072\\U+1088\\U+1080\\U+1090\\U+1085\\U+1086\\U+1089\\U+1090\\U+1100"

我想将它转换为我的默认代码系统(System.Text.Encoding.Default):

-       System.Text.Encoding.Default    {System.Text.SBCSCodePageEncoding}  System.Text.Encoding {System.Text.SBCSCodePageEncoding}
+       [System.Text.SBCSCodePageEncoding]  {System.Text.SBCSCodePageEncoding}  System.Text.SBCSCodePageEncoding
        BodyName    "koi8-r"    string
        CodePage    1251    int
+       DecoderFallback {System.Text.InternalDecoderBestFitFallback}    System.Text.DecoderFallback {System.Text.InternalDecoderBestFitFallback}
+       EncoderFallback {System.Text.InternalEncoderBestFitFallback}    System.Text.EncoderFallback {System.Text.InternalEncoderBestFitFallback}
        EncodingName    "Cyrillic (Windows)"    string
        HeaderName  "windows-1251"  string
        IsBrowserDisplay    true    bool
        IsBrowserSave   true    bool
        IsMailNewsDisplay   true    bool
        IsMailNewsSave  true    bool
        IsReadOnly  true    bool
        IsSingleByte    true    bool
        WebName "windows-1251"  string
        WindowsCodePage 1251    int

我如何确定代码系统以及如何转换它?

4

1 回答 1

11

我不确定我是否真的理解你的问题。

在 .NET 中,当您有一个字符串对象时,您不需要关心不同的编码。所有 .NET 字符串都使用相同的编码:Unicode(或更准确地说:UTF-16)。

只有当您将字符串对象转换为字节序列(例如将其写入文本文件)或反之亦然时,不同的文本编码才会发挥作用。我假设你在谈论这个。要将字节序列从一种编码转换为另一种编码,您可以编写:

byte[] input = ReadInput(); // e.g. from a file
Encoding decoder = Encoding.GetEncoding("encoding of input");
string str = decoder.GetString(input);
Encoding encoder = Encoding.GetEncoding("encoding of output");
byte[] ouput = encoder.GetBytes(str);

当然,您需要用正确的编码名称替换encoding of input和。encoding of outputMSDN列出了所有支持的编码

您需要知道输入的编码,无论是按照惯例还是基于元数据或其他东西。您无法可靠地确定/猜测未知编码,但您可以应用一些技巧和启发式方法。请参阅如何检测文本文件的编码/代码页

编辑:

“U+xxxx”是您通常指代特定 Unicode 代码点(分配给 Unicode 字符的数字)的方式,例如字母“A”(拉丁文大写 A)的代码点是 U+0041。

您的输入字符串实际上是“ \\U+1043...”(反斜杠、反斜杠、大写 U 等)还是仅像这样显示在调试器窗口中?如果是第一个,那么有人在对文本进行编码时犯了一个错误,可能是通过尝试编写 Unicode 文字并通过编写第二个文字意外转义反斜杠(Edit2:或者故意以转义方式保存字符以将它们写入ASCII 编码的文件/流/等)。据我所知,.NET 编码类在这里对您没有帮助;您需要手动解析字符串。

顺便说一句,您示例中的数字很奇怪。在标准符号中,“U+”后面的数字是十六进制数,而不是十进制数。但是,如果您将代码点读取为十六进制数字,那么它们指的是完全不相关的脚本系统(缅甸语、格鲁吉亚语 Mkhedruli、韩语 Jamo)中的字符;读为十进制数字,但它们都指的是西里尔字母。

Edit3:要解析它,好吧,在表单中查找子字符串\\U+xxxx(x 是数字),转换xxxx为 int n,使用该代码点()创建一个 char,Char.ConvertFromUtf32(n)然后用该 char 替换整个子字符串。

于 2012-11-29T12:15:45.447 回答