我在外来编码系统中有一个输入字符串,即:"\\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
我如何确定代码系统以及如何投射它?
答案 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 input
和encoding 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替换整个子字符串。