来自字符串的MemoryStream - 关于要使用的编码的混乱

时间:2011-05-31 13:12:56

标签: c# .net encoding

我有一段将字符串转换为内存流的代码:

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>即可。这就是提到的使用.... 语句的地方。

5 个答案:

答案 0 :(得分:3)

假设applicationForm是您从某个UTF8文本文件中读取的字符串。无论源文件的编码如何,它都是UTF16 / Unicode。将文件加载到字符串中时发生转换。

您的代码会将applicationForm字符串编码为MemoryStreamUTF8字节。

根据您的想法,这可能会也可能不正确。

.Net字符串始终为UTF16Unicode。将Strings转换为文件,流或byte[]时,可以以不同方式对其进行编码。 1个字节不足以存储所有语言中使用的所有不同的字符,因此需要对更复杂的字符串进行编码,因此一个字符串可以由多个字节表示,有时或总是取决于所使用的编码。

如果您使用像ASCII这样的简单编码,则一个字符将始终包含一个字节,但数据将仅限于ASCII字符集。如果使用任何多字节字符,从任何UTF编码转换为'ASCII'都可能会丢失数据。

关于unicode go here的完整图片。

编辑1: 除非有关 GenerateApplicationForm 组件的更多信息,否则UTF8可能是正确的选择。如果有效,请尝试ASCIIUTF16。最重要的是,请参阅组件源代码或组件提供程序。

编辑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将它解码为原始值