当前位置:  开发笔记 > 编程语言 > 正文

".NET框架默认使用UTF-16编码标准"是什么意思?

如何解决《".NET框架默认使用UTF-16编码标准"是什么意思?》经验,为你挑选了2个好方法。

我的学习指南(70-536考试)在文章和编码章节中说了两次,这是在IO章之后.

到目前为止,所有示例都与使用FileStream和StreamWriter的简单文件访问有关.

它也说"如果你不知道在创建文件时要使用什么编码,请不要指定一个,.NET将使用UTF16"和"使用Stream构造函数重载指定不同的编码".

没关系,实际的重载是在StreamWriter类上,但是嘿,无论如何.

我现在正在反射器中查看StreamWriter,我确信我可以看到默认情况下是默认的UTF8NoBOM.

但这些都没有在勘误表中列出.这是一本旧书(对两个版本的错误进行了调整)所以如果错了,我会认为有人已经接受了......

让我想起也许我不理解它.

那么.....任何想法,它在说什么?还有其他一些违约的地方?

这让我很困惑.



1> bobince..:

"UTF-16"是一个令人讨厌的术语,因为它有两个容易混淆的含义.

第一个含义是一系列16位代码点.其中大多数直接对应于相同数字的Unicode字符; 基本多语言平面之外的字符(U + 10000以上)存储为两个16位代码点,每个代理点都是一个代理.

许多语言在这个意义上使用UTF-16进行内部存储,包括作为本机字符串类型.这是".NET(或Java)使用UTF-16作为其默认编码"这类短语的常见来源..NET一次访问这种UTF-16字符串16位的元素(即,在实现级别,作为uint16).

接下来要考虑的是将这种UTF-16字符串编码为线性字节,以便存储在文件或网络流中.与往常一样,当您将更大的数字存储为字节时,有两种可能的编码:little-endian或big-endian.因此,您可以使用"UTF-16LE",UTF-16的little-endian编码为字节,或"UTF-16BE",big-endian编码.

("UTF-16LE"是更常用的.为了给火焰添加更多的混淆,Windows给它带来了深刻误导和模糊的编码名称"Unicode".实际上,使用UTF-8进行文件存储几乎总是更好和网络流比UTF-16LE/BE都要好.)

但是如果你不知道一堆字节是否包含"UTF-16LE"或"UTF-16BE",你可以使用查看第一个代码点的技巧来解决它.此代码点(字节顺序标记(BOM))仅在单向读取时有效,因此您不能将一种编码误认为另一种编码.

这种方法,不关心你有什么字节顺序,但使用BOM来发信号,通常在编码名称下引用......"UTF-16".

因此,当有人说"UTF-16"时,你无法判断它们是指一系列短int Unicode代码点,还是一个未指定顺序的字节序列,它将解码为一个.

("UTF-32"也存在同样的问题.)

如果您不知道在创建文件时要使用的编码,请不要指定一个,.NET将使用UTF16

如果那是实际的直接引用则是谎言.明确指定构造没有编码参数的StreamWriter 以提供UTF-8.



2> LaserJesus..:

绝对最低每个软件开发人员绝对必须知道关于Unicode和字符集(没有任何借口!)作者:Joel Spolsky

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有