我在外来编码系统中有一个输入字符串,即: "\\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
Run Code Online (Sandbox Code Playgroud)
我如何确定代码系统以及如何投射它?
Seb*_*zus 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);
Run Code Online (Sandbox Code Playgroud)
当然,你需要更换encoding of input
,并encoding of output
用适当的编码名称.MSDN 列出了所有支持的编码.
您需要通过约定或基于元数据等知道输入的编码.您无法可靠地确定/猜测未知编码,但您可以应用一些技巧和启发式方法.请参阅如何检测文本文件的编码/代码页.
编辑:
"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 n
,用该代码点(Char.ConvertFromUtf32(n)
)创建一个char,并用该char替换整个子串.
归档时间: |
|
查看次数: |
5248 次 |
最近记录: |