Vb6 使用ISO-8859-1编码写入文件

Vb6 使用ISO-8859-1编码写入文件,vb6,character-encoding,Vb6,Character Encoding,我有一些vb6代码顽固地写在Windows-1252上 Open fileName For Binary Access Write As #fileNo Put #fileNo, , contents Close #fileNo 通过这样做,我成功地将其写入UTF-16 LE contents = ChrW$(&HFEFF&) & contents 有没有什么方法可以让它轻松写入ISO-8859-1?这里的示例/建议将不胜感激。Windows-1252本质

我有一些vb6代码顽固地写在Windows-1252上

  Open fileName For Binary Access Write As #fileNo
  Put #fileNo, , contents
  Close #fileNo
通过这样做,我成功地将其写入UTF-16 LE

contents = ChrW$(&HFEFF&) & contents

有没有什么方法可以让它轻松写入ISO-8859-1?这里的示例/建议将不胜感激。

Windows-1252本质上是ISO-8859-1的超集;只需将数据写入Windows-1522,不要使用任何Windows-1252字符,这些字符不是ISO-8859-1字符。

Windows-1252本质上是ISO-8859-1的超集;只需将数据写入Windows-1522,不要使用任何Windows-1252字符,这些字符不是ISO-8859-1字符。

VB6字符输出在非Unicode程序的默认机器代码页中进行编码

如果您能够设法将机器代码页设置为28591,这是最新的,那么您可以完全确定您的输出将是iso-8859-1 或者,避免使用Windows 1252与ISO-8859-1不同的字符。维基百科说这是128比159。您可以检测它们并用问号替换或抛出错误。
VB6字符输出在非Unicode程序的默认机器代码页中进行编码

如果您能够设法将机器代码页设置为28591,这是最新的,那么您可以完全确定您的输出将是iso-8859-1 或者,避免使用Windows 1252与ISO-8859-1不同的字符。维基百科说这是128比159。您可以检测它们并用问号替换或抛出错误。
如果您的文件不是很大,那么ADO可以帮助您快速而肮脏地处理奇数编码

例如:

Option Explicit

Private Sub Main()
    Const contents As String = "Hello World.  (4 × 6) ÷ 8 = 3 €€€ ƒƒƒ"
    Dim Stm As ADODB.Stream

    Set Stm = New ADODB.Stream
    With Stm
        .Open
        .Type = adTypeText
        .Charset = "iso-8859-1"
        .LineSeparator = adLF
        .WriteText contents, adWriteLine
        .SaveToFile "ISO-8859-1.txt", adSaveCreateOverWrite
        .Close

        .Open
        .Type = adTypeText
        .Charset = "windows-1252"
        .LineSeparator = adCRLF
        .WriteText contents, adWriteLine
        .SaveToFile "Windows-1252.txt", adSaveCreateOverWrite
        .Close
    End With
    MsgBox "Done"
End Sub

如果您的文件不是很大,那么ADO可以帮助您快速而肮脏地处理奇数编码

例如:

Option Explicit

Private Sub Main()
    Const contents As String = "Hello World.  (4 × 6) ÷ 8 = 3 €€€ ƒƒƒ"
    Dim Stm As ADODB.Stream

    Set Stm = New ADODB.Stream
    With Stm
        .Open
        .Type = adTypeText
        .Charset = "iso-8859-1"
        .LineSeparator = adLF
        .WriteText contents, adWriteLine
        .SaveToFile "ISO-8859-1.txt", adSaveCreateOverWrite
        .Close

        .Open
        .Type = adTypeText
        .Charset = "windows-1252"
        .LineSeparator = adCRLF
        .WriteText contents, adWriteLine
        .SaveToFile "Windows-1252.txt", adSaveCreateOverWrite
        .Close
    End With
    MsgBox "Done"
End Sub

在开始时放一个假的BOM并不能神奇地使其成为UTF-16。您还需要更改数据写入以输出原始unicode数据。这不是一个解决方案,而是一个彻头彻尾的谎言。除非您写出的数据不是本地字符集,否则文本仍将编码为本地字符集string@Deanna:你确定吗?我找不到任何文档来解释这一点,但假定宽字符串与常规字符串的连接是宽字符串与常规字符串的字符被提升/加宽。如果Put高兴地将x{FEFF}写成\xFF\xFE小端UTF-16,正如问题所暗示的那样,那么这表明,例如\x20将写成\x20\x00。换句话说,我猜它写的是真正的UTF-16LE,而不仅仅是带有UTF-16LE BOM的ASCII。@ruakh:是的。VB字符串在内部始终为unicode,但在超出其控制范围(例如文件或API)时会转换为本地字符集。由于内容是字符串,字节数组失败,类型不匹配包含wibble,上述代码写入77 69 62 6C 65。将假BOM表添加到字符串中,只会导致在二进制数据的开头加上3F。@ruakh:没错。谁知道他们得到了什么,因为他们似乎在细节上非常模糊。如果内容是一个字节数组,那么它应该是UTF-16,但是他们不能对它进行字符串连接。在开始时放一个假的BOM表并不能神奇地使它成为UTF-16。您还需要更改数据写入以输出原始unicode数据。这不是一个解决方案,而是一个彻头彻尾的谎言。除非您写出的数据不是本地字符集,否则文本仍将编码为本地字符集string@Deanna:你确定吗?我找不到任何文档来解释这一点,但假定宽字符串与常规字符串的连接是宽字符串与常规字符串的字符被提升/加宽。如果Put高兴地将x{FEFF}写成\xFF\xFE小端UTF-16,正如问题所暗示的那样,那么这表明,例如\x20将写成\x20\x00。换句话说,我猜它写的是真正的UTF-16LE,而不仅仅是带有UTF-16LE BOM的ASCII。@ruakh:是的。VB字符串在内部始终为unicode,但在超出其控制范围(例如文件或API)时会转换为本地字符集。由于内容是字符串,字节数组失败,类型不匹配包含wibble,上述代码写入77 69 62 6C 65。将假BOM表添加到字符串中,只会导致在二进制数据的开头加上3F。@ruakh:没错。谁知道他们得到了什么,因为他们似乎在细节上非常模糊。如果内容是一个字节数组,我想应该是UTF-16,但他们不能对其进行字符串连接。这也是我最初的想法,但我的同行不接受它作为解决方案。还有其他想法吗?您的同行是如何确定文件编码的?也就是说,他们如何确定您的输出文件是Windows-1252,而不是他们想要的ISO-8859-1?有可能你误解了他们的问题吗?他们有一些旧软件
他们声称他们在Windows-1252上有特定问题。这就是我所知道的一切,他们拒绝就此让步。我正在考虑编写一个简单的c工具,在第一次编写之后进行转换。这很傻,但也许并不比花太多时间去寻找vb6解决方案更傻。如果是这样,就告诉他们你正在给他们发送ISO-8859-1。这是事实。但是为了安全起见,您应该编写一个简单的C工具来确保它实际上是ISO-8859-1!这也是我最初的想法,但我的同行并不接受这一解决方案。还有其他想法吗?您的同行是如何确定文件编码的?也就是说,他们如何确定您的输出文件是Windows-1252,而不是他们想要的ISO-8859-1?有没有可能你误解了他们的问题?他们有一些旧软件,声称他们在Windows-1252上有特定的问题。这就是我所知道的一切,他们拒绝就此让步。我正在考虑编写一个简单的c工具,在第一次编写之后进行转换。这很傻,但也许并不比花太多时间去寻找vb6解决方案更傻。如果是这样,就告诉他们你正在给他们发送ISO-8859-1。这是事实。但是为了安全起见,您应该编写一个简单的C工具来确保它实际上是ISO-8859-1!据我所知,BOM仅适用于Unicode,如果您想要ISO-8859-1,则BOM毫无意义。我还应该指出对线端的控制。您可以在CR、LF和CRLF中进行选择。你甚至可以用它来读取编码文件。据我所知,BOM表只适用于Unicode,如果你想要ISO-8859-1,那么BOM表就没有意义了。我应该指出对行尾的控制。您可以在CR、LF和CRLF中进行选择。您甚至可以使用它来读取编码文件。问号适用于某些东西,如欧元符号€,但在某些情况下需要翻译,例如从ƒ到f。问号适用于欧元符号€,但在某些情况下需要翻译,例如从ƒ到f。