我的桌面c#应用程序从用户那里获取各种文档,可能采用不同的编码方式。
我需要向用户显示现有文档,允许在我的UI中操作它们,并存储它们以备将来使用。
为每个步骤添加“编码”的概念对我来说似乎很复杂。我想在内部总是将用户输入文档转换为UTF-8,因此我的UI和数据存储不需要担心它。然后,当用户想要将文档作为文件返回时,我会询问用户使用哪种编码。
这有意义吗?编码是否具有互操作性?如果我只支持unicode怎么办?
答案 0 :(得分:2)
在您的应用程序中,您应该使用本机Unicode支持(平台用于存储Unicode的内容)。在Windows和OS X上,这是一种UTF-16
,但在Linux上它是UTF-8
。
在保存/加载文件或与外部系统通信时,请转到UTF-8
。
另外,不要将代码页与编码混淆。
关于代码页,今天我认为再支持它们并不是那么重要。至少它不应该是你的优先考虑。因为对于ANSI编码你没有BOM,所以很难猜测文件的编码(实际上它是不可能完美地完成的)。
答案 1 :(得分:1)
编码不可互操作,因为某些编码具有其他人没有的字符。
Unicode内部表示是一个好主意,因为它具有更宽的字符集,但如果添加的字符仍在所述编码中,我建议以原始编码保存文档。如果没有,则提示用户您将以Unicode格式保存,以便正确编码这些字符。
答案 2 :(得分:1)
只需将所有文档解码为String
即可。 .Net中的字符串始终是Unicode(utf-16)。只在您阅读或撰写文件时使用编码。
答案 3 :(得分:0)
当您获得ANSI文件时,您应该在转换为unicode e之前知道代码页。 G。创建一个utf-16字符串,否则从128到255的字节可能导致错误的unicode代码点。当你想将unicode字符串存储到ANSI文件时,你可能会遇到麻烦,因为高达0x10ffff的代码点不能适合单个字节。
答案 4 :(得分:0)
在交换格式中使用UTF-16只有两个原因(即从A发送到B的那个):
除非有这种情况,否则在交换格式中使用UTF-8以外的任何东西只有两个原因:
如果你特别讨厌那些不使用自己语言的外国人和人,那么2号就特别紧迫,但如果你只是讨厌一般人,你会给足够多的人带来足够的麻烦,你应该觉得这项运动令人满意。 / p>
现在,从那里开始,如果由其他人设计的给定文档格式允许UTF-8,并且您可以期望处理它的所有现代软件都能够处理UTF-8,那么有两个原因不能做这样:
对于你的内部存储,它只是对你最有用的事情的问题。通常,.NET在内存中( char 和 string 使用它时)和UTF-8在写入和读取字符串时往往默认为UTF-16。如果您的后备存储是SQL Server,那么UTF-16是您的朋友('char','nvarchar','ntext'变体'char','varchar','text'以避免问题,如果字符集是设置为UTF-8以外的任何其他数据库,其他数据库要么有自己处理现代字符的方式,要么可以使用UTF-8。
一般情况下,使用UTF-8,除非有人强迫你做其他事情(因为他们被迫处理20世纪90年代或更早的代码,或者因为他们讨厌人)。