【问题标题】:Classic ASP convert string to windows-1252经典 ASP 将字符串转换为 windows-1252
【发布时间】:2024-01-02 09:01:01
【问题描述】:

我正在处理一个以 UTF-8 编码的 POST 请求。此 POST 请求负责在某个文件夹中创建文件。但是,当我查看俄罗斯字符的文件名时,我看到文件名的垃圾值(文件内容正常)。文件名的英文字符是可以的。在我看到的脚本中:

Set fsOBJ= Server.CreateObject("Scripting.FileSystemObject")
Set fsOBJ= fsObj.CreateTextFile(fsOBJ.BuildPath(Path, strFileName))

我相信“strFileName”是我的问题。 Windows 似乎不喜欢 UTF-8 文件名。关于如何解决这个问题的任何想法。

【问题讨论】:

  • 感谢您的回复,但我已经尝试使用单个字母文件名“k”并得到“Рє”。还有其他想法吗?
  • strFileName 从何而来?来自 POST 还是来自数据库?如果来自数据库,列/表是否设置为 UTF-8?
  • 感谢您的回复。 POST 直接来自表单的用户输入。我知道数据总是以 UTF-8 的形式出现,因为当它通过 wireshark 时我能够正确解码文件名。谢谢。

标签: asp-classic utf-8


【解决方案1】:

VBScript 字符串是严格的 2 字节 unicode,任何用于存储或传输字符串的编码都会在 VBScript 中存在字符串之前转换为 unicode。

我的猜测是您的表单帖子带有文件名,并且帖子被编码为 UTF-8。但是,在解码带有文件名的表单字段时,您的接收页面的 CodePage 设置为 65001(UTF-8 代码页)以外的值。因此,从表单中检索到的字符串已损坏。

<%@ CODEPAGE=65001 %> 添加到您的页面,在页面顶部包含Response.CharSet = "UTF-8" 并将其保存为UTF-8。

现在,当源表单将 UTF-8 编码的表单数据发布到页面时,表单数据将被正确解码为 un​​icode。

【讨论】:

  • 有趣。是的,当 POST 发生时,我的表单 POST 确实将文件名编码为 UTF-8。这我无法更改,因为 POST 来自嵌入式设备。我确实将 IIS 上的 CodePage 设置为 65001,但后来我的脚本不起作用......它似乎只适用于 65001 以下的 CodePage。我确实注意到了同样的问题不同代码页的文件名更改。所以也许我需要做的就是以某种方式将其设置为 65001 而不会崩溃。我的主要开发环境是 Linux,我没有专业版附带的 MS VS2010 调试工具。
  • 我还应该提到我关注了msdn.microsoft.com/en-us/library/ms525789%28v=vs.90%29.aspx。我遇到的唯一问题是在 IIS 中设置 65001,但我想如果在我的 ASP 文件顶部指定了代码页,我就不需要...