确定文本代码类型并强制转换为默认值

时间:2012-11-29 10:38:39

标签: c# .net f#

我在外来编码系统中有一个输入字符串,即:"\\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

我如何确定代码系统以及如何投射它?

1 个答案:

答案 0 :(得分: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 inputencoding of output。 MSDN有list of all supported encodings

您需要通过约定或基于元数据等知道输入的编码。您无法可靠地确定/猜测未知编码,但您可以应用一些技巧和启发式方法。请参阅How can I detect the encoding/codepage of a text file

修改

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

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

顺便说一句,你的例子中的数字很奇怪。在标准表示法中,“U +”后面的数字是十六进制数,而不是十进制数。但是如果你把代码点读作十六进制数字,那么它们就是指完全不相关的脚本系统中的字符(Burmese,Georgian Mkhedruli,Hangul Jamo);但是,作为十进制数字,它们都是指西里尔字母。

编辑3:要解析它,请查看\\U+xxxx形式的子字符串(x为数字),将xxxx转换为int {{1}使用该代码点(n)创建一个char,并用该char替换整个子字符串。