2011-08-10 105 views
4

可能重复:
Determine a string's encoding in C#有没有办法检查一个C#字符串的编码?

我相信,如果我创建一个字符串默认为UTF8,但是如果字符串被人创建的地方,我想处理前要格外安全它并检查它的编码是什么,我没有看到使用字符串或编码类的任何简单的方法。我是否缺少某些东西或者是C#字符串,总是UTF8,不管是什么?在C#

+0

你从哪里得到这样的想法:字符串*有*编码还是默认为UTF-8?看到我的答案更多,但我只是想知道你有什么印象... –

回答

7

字符串(当然,.NET)不编码,有效地...或者你可以查看所有这些为UTF-16,因为他们是char值的序列,这是UTF -16个编码单元。

但是,通常情况下,只需要在从字符串转换为二进制形式(例如向下套接字或文件)时关心编码。在这一点上,你应该明确指定编码 - 字符串本身没有这个概念。

“默认”UTF-8的唯一方面是有很多.NET API被重载到要么接受编码,要么没有指定编码,使用UTF-8。 File.ReadAllText就是这样的一个例子。然而,在阅读文件之后,“从UTF-8文件读取的文本”和“从Big5文件读取的文本”之间没有区别等。

+0

当然,你的意思是字符串中的字符串是16位代码**单元的序列**不是点,因为代码**点* *需要21位完整的Unicode。我知道*你*知道得更好,但UTF-16诅咒折磨了很多其他程序员,并且每一次直接告诉他们的机会都值得去做。一个不能存储一个16位字符的Unicode字符;它需要一个32位整数。 – tchrist

+0

@tchrist:我总是忘记这两个人的方向,对不起 - 现在修好了。我完全同意这是值得的。其中一天,我会想出一个助记符,以避免再次出错... –

+0

关于助记符,也许这将有助于单位有尺寸和点无量纲。 UTF-8具有8位代码单元,而UTF-16具有16位代码单元,但代码点本身是不具有位宽的抽象整数。好吧,好几个单位都没有意义。让我想一想这一点。 – tchrist

相关问题