【问题标题】:filestream encoding not as expected文件流编码不符合预期
【发布时间】:2013-08-07 06:44:52
【问题描述】:

我有一个使用非 ASCII 字符的文件,当使用文件流保存此文件时,文件中的字符与预期不符。

我写

stream
BT 38.3774 710 TD /F10 12.0000 Tf (België)Tj ET
endstream

文件中的内容是

stream
BT 38.3774 710 TD /F10 12.0000 Tf (België)Tj ET
endstream

在使用 filestream.write 将字符串保存到文件之前,字符串被 UTF8 编码为字节。

有人可以帮我理解为什么会这样吗?

我已经能够在代码的简短版本中重现结果

Using newFile As New FileStream("C:\Users\Sed\Documents\test.txt", FileMode.Create)
        Dim content As String = "België"
        Dim contentByte As Byte() = New UTF32Encoding().GetBytes(content)
        newFile.Write(contentByte, 0, contentByte.Length)
        contentByte = New UTF8Encoding().GetBytes(content)
        newFile.Write(contentByte, 0, contentByte.Length)
    End Using

给出结果

B   e   l   g   i   ë   België

所以我希望文件流以某种方式假定它的 UTF32 编码,而文件的内容正在以 UTF8 写入......

将其全部编码为 UTF32 并不能提供答案。然后文件完全混乱了......

仍然不明白为什么会发生这种情况,但我脑子里有一个我需要探索的解决方法。

【问题讨论】:

  • "在使用 filestream.write 之前,字符串被 UTF8 编码为字节"你是什么意思?您需要显示您的代码。我怀疑你可能是双重编码 - 或者你实际上在文件中得到了完全正确的数据,而你只是在错误的编码中查看它。如果您也可以在文件中提供 bytes 会有所帮助(如在十六进制编辑器中所见)。

标签: vb.net encoding utf-8 filestream non-ascii-characters


【解决方案1】:

我想通了……

我按照我的方式创建文件,它使用的编码是 ANSI 或 encoding.Default

变化很大

Dim newObjectByte As Byte() = New UTF8Encoding(True).GetBytes(DataObject("pdfObjectString").ToString())

Dim newObjectByte As Byte() = Encoding.Default.GetBytes(DataObject("pdfObjectString").ToString())

解决了我的代码页问题。

感谢The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 让我想到了代码页、ANSI ASCII 和所有这些东西......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多