Encoding ASP中使用中英文字符时的编码问题

Encoding ASP中使用中英文字符时的编码问题,encoding,character-encoding,asp-classic,httpresponse,Encoding,Character Encoding,Asp Classic,Httpresponse,我在ASP网站中编码中文时遇到问题。文件格式为: translations.txt-UTF-8(用于存储我的翻译) test.asp-UTF-8-(用于呈现页面) test.asp正在读取包含以下数据的translations.txt: Help|ZH|帮助 Home|ZH|首页 test.asp在管道分隔符上拆分,如果用户包含一个带有ZH的cookie,它将显示此转换,否则它将恢复为键值 现在,我尝试了以下方法,但都没有成功: 添加元标记 设置Response.CharSet=“UT

我在ASP网站中编码中文时遇到问题。文件格式为:

  • translations.txt-UTF-8(用于存储我的翻译)
  • test.asp-UTF-8-(用于呈现页面)
test.asp正在读取包含以下数据的translations.txt:

Help|ZH|帮助 
Home|ZH|首页
test.asp在管道分隔符上拆分,如果用户包含一个带有ZH的cookie,它将显示此转换,否则它将恢复为键值

现在,我尝试了以下方法,但都没有成功:

  • 添加元标记

  • 设置
    Response.CharSet=“UTF-8”

  • 设置
    Response.ContentType=“text/html”
  • 将Session.CodePage(和响应)同时设置为65001(UTF-8)
  • 我已经确认
    translations.txt
    中的文本肯定是UTF-8,并且没有字节顺序标记
  • 浏览器检测到该页面是Unicode UTF-8,但该页面显示的是GobbleDeBook
  • Scripting.OpenTextFile(,,)
    方法返回相同的错误文本,而不考虑编码参数 以下是我想在中国展示的内容示例(ZH):

    • 首页
    • 帮助
    但会显示以下内容:

    • 阿尔法-阿尔法
    • å¸ååŠ
    所有测试过的浏览器都会出现这种情况——谷歌浏览器、IE 7/8和Firefox4。这种字体肯定有一个字形的中文分支。另外,我确实安装了东方语言

    --

    我已经尝试将原始值粘贴到HTML中,这确实有效(但请注意,这是一个硬编码的值)

    • 首页
    • 阿尔法-阿尔法
    然而,这很奇怪

    首页 --(十六进制)->E9 A6 96 E9 A1--(作为字符)->α-µ


    你知道我遗漏了什么吗?

    在阅读
    translations.txt
    文件的过程中,似乎没有理解该文件是UTF-8格式的。它看起来像是在读取其他编码。您应该在打开和读取该文件的任何进程中指定编码。这将与网页的编码不同


    在该文件的开头插入字节顺序标记也可能是一个解决方案。

    要读取UTF-8文件,可能需要使用该对象。我并不自称是字符编码方面的专家,但这项测试对我很有效:

    test.txt(保存为不带BOM的UTF-8):

    首页
    帮助

    test.vbs

    Option Explicit
    
    Const adTypeText = 2
    Const adReadLine = -2
    
    Dim stream : Set stream = CreateObject("ADODB.Stream")
    stream.Open
    stream.Type = adTypeText
    stream.Charset = "UTF-8"
    stream.LoadFromFile "test.txt"
    
    Do Until stream.EOS
        WScript.Echo stream.ReadText(adReadLine)
    Loop
    
    stream.Close
    

    Scripting.OpenTextFile
    根本不理解UTF-8。它只能读取当前的OEM编码或Unicode。从某些字符集使用的字节数可以看出,UTF-8的效率非常低。对于这类数据,我建议使用Unicode

    您应该将文件另存为Unicode(用Windows术语),然后使用以下方式打开:

    Dim stream : Set stream = Scripting.OpenTextFile(yourFilePath, 1, false, -1)
    

    只需使用页面顶部的脚本

    Response.CodePage=65001
    Response.CharSet="UTF-8"
    

    这将是OpenTextFile()方法中的-1(UTF-8)编码。问题是ASP不喜欢文件中的字节顺序标记,因为它在数据中包含二进制标记。然而,即使跳过了这一步,文本仍然从文件中被错误地读取,就像我在上面介绍的一样。这是一种痛苦:-(@Dominic Zukiewicz-我不知道这是否有效,但请尝试使用1而不是-1。如果不起作用,请尝试使用UTF-16LE(Windows本地的“Unicode”)作为编码。@Dominic:
    脚本。OpenTextFile
    根本不理解UTF-8。此外,UTF-8对于这些字符不是一个好的选择,直接的2字节Unicode更好,OpenTextFile也能理解。@AnthonyWJones:我刚刚将文件转换为UTF-16 LE,现在它将单个字符解释为一个完整的行。因此“Home”被读取为4行-‘H’、‘o’、‘m’、‘e’。它一定认为空值是行分隔符。这是可行的,但如果text.txt很大,请注意内存使用情况,并确保
    关闭流,ADODB。如果不关闭流,流可能会有点古怪。