我有一段将字符串转换为内存流的代码:
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(applicationForm)))
但是如果它是正确的我会有点困惑。基本上我总是对.NET编码感到困惑。
底线:我是否使用正确的编码对象( UTF8 )来获取字节?
我知道.NET内部将字符串存储为 UTF-16 ,但我的 applicationForm 变量基于带有文本的文件,该文件保存在 UTF-8中编码。
谢谢,帕维尔
编辑1:让我们解释一下我如何获得 applicationForm 变量。我有权访问使用方法 GenerateApplicationForm 公开类的程序集。该方法返回字符串。但是我知道,在幕后的某个地方,组件使用存储在驱动器上的文件。这些文件的内容使用UTF-8编码。所以我无法直接读取文件等。我只有那个字符串,我知道,最初使用的是UTF-8编码文件。 在使用 GenerateApplicationForm 组件的客户端代码中,我必须将 applicationForm 变量转换为流,其他组件(来自其他程序集)期望 Stream < / strong>即可。这就是提到的使用.... 语句的地方。
答案 0 :(得分:3)
假设applicationForm
是您从某个UTF8
文本文件中读取的字符串。无论源文件的编码如何,它都是UTF16
/ Unicode
。将文件加载到字符串中时发生转换。
您的代码会将applicationForm
字符串编码为MemoryStream
个UTF8
字节。
根据您的想法,这可能会也可能不正确。
.Net字符串始终为UTF16
或Unicode
。将Strings
转换为文件,流或byte[]
时,可以以不同方式对其进行编码。 1个字节不足以存储所有语言中使用的所有不同的字符,因此需要对更复杂的字符串进行编码,因此一个字符串可以由多个字节表示,有时或总是取决于所使用的编码。
如果您使用像ASCII
这样的简单编码,则一个字符将始终包含一个字节,但数据将仅限于ASCII
字符集。如果使用任何多字节字符,从任何UTF编码转换为'ASCII'都可能会丢失数据。
关于unicode go here的完整图片。
编辑1:
除非有关 GenerateApplicationForm 组件的更多信息,否则UTF8
可能是正确的选择。如果有效,请尝试ASCII
或UTF16
。最重要的是,请参阅组件源代码或组件提供程序。
编辑2:
那肯定是UTF8
,你一直都是对的。
答案 1 :(得分:0)
如果数据以UTF-8保存,则需要使用UTF-8打开它。
答案 2 :(得分:0)
只需使用相同的编码即可阅读。如果是UTF8 - >使用UTF8。如果你写中文,sombody必须能够阅读中文才能理解你...
答案 3 :(得分:0)
对于UTF-8字节顺序标记(BOM)应添加在文件的开头。请参阅文件是utf-8,然后使用utf-8转换器。
答案 4 :(得分:0)
UTF8字节编码生成数据的表示,该数据向后兼容ASCII字符集以表示您的数据。由于ASCII是数据传输的最小公分母,因此您几乎可以保证这种表示形式适用于绝大多数系统。
虽然你可以改变它,但你假设任何系统都会理解你已经改变它并支持你的新表示。这是一个非常难以检查的假设。两端的编码很匹配。
如果如你所说,你无法改变生成字符串的系统,那么是的,你做得对。它有效,为什么你认为你需要做出改变? .NET表示字符串的内部结构在这里没有发挥作用,你没有获得.NET字符串,你得到一个值的UTF-8编码表示,所以你必须使用UTF8将它解码为原始值