【问题标题】:Convert UTF-8 string to ISO-8859-1将 UTF-8 字符串转换为 ISO-8859-1
【发布时间】:2018-02-12 18:50:34
【问题描述】:

我的 Classic ASP 应用程序从其数据库中检索一个 UTF-8 字符串,但我需要将其转换为 ISO-8859-1。我无法更改 HTML 页面编码;

我真的只需要转换获取的字符串。我该怎么做?

【问题讨论】:

  • 搜索一下这个已经被你和其他人回答过无数次的网站怎么样!例如,只需浏览该问题右侧的相关部分。
  • @Lankymart 我见过这个问题,但它的答案涉及整个脚本文件。我想转换一个源自数据库的字符串,所以它甚至没有在该文件中明确说明。我只需要转换一个字符串,并将文件的其余部分保持原样(ISO-8859-1)。但我是经典 ASP 的新手,我可能没有正确掌握答案。鉴于此澄清,您认为是这样吗?如果我错了,我会要求澄清该答案的 cmets。
  • @Lankymart 我一直在寻找 DAYS 的答案,并在这里尝试过。相关问题没有用,因为它们主要涉及其他语言。我避免确切地问,因为人们对新的非常挑剔。有太多次我在我访问的 StackExchange 网站上提出了一个问题,并且不得不努力让我的问题保持开放。对我的咆哮感到抱歉。
  • 我使用不带site:stackoverflow.com 的google 以获得更广泛的结果。但它确实似乎比 SO 搜索效果更好。谢谢,

标签: string vbscript asp-classic character-encoding


【解决方案1】:

我找到了答案here

Const adTypeBinary = 1
Const adTypeText = 2

' accept a string and convert it to Bytes array in the selected Charset
Function StringToBytes(Str,Charset)
  Dim Stream : Set Stream = Server.CreateObject("ADODB.Stream")
  Stream.Type = adTypeText
  Stream.Charset = Charset
  Stream.Open
  Stream.WriteText Str
  Stream.Flush
  Stream.Position = 0
  ' rewind stream and read Bytes
  Stream.Type = adTypeBinary
  StringToBytes= Stream.Read
  Stream.Close
  Set Stream = Nothing
End Function

' accept Bytes array and convert it to a string using the selected charset
Function BytesToString(Bytes, Charset)
  Dim Stream : Set Stream = Server.CreateObject("ADODB.Stream")
  Stream.Charset = Charset
  Stream.Type = adTypeBinary
  Stream.Open
  Stream.Write Bytes
  Stream.Flush
  Stream.Position = 0
  ' rewind stream and read text
  Stream.Type = adTypeText
  BytesToString= Stream.ReadText
  Stream.Close
  Set Stream = Nothing
End Function

' This will alter charset of a string from 1-byte charset(as windows-1252)
' to another 1-byte charset(as windows-1251)
Function AlterCharset(Str, FromCharset, ToCharset)
  Dim Bytes
  Bytes = StringToBytes(Str, FromCharset)
  AlterCharset = BytesToString(Bytes, ToCharset)
End Function

所以我就这样做了:

AlterCharset(str, "ISO-8859-1", "UTF-8")

而且效果很好。

【讨论】:

  • 这将起作用,但请记住,如果您的源编码是 UTF-8 并且您转换为 ISO-8859-1,您将取决于 UTF-8 字符集中的字符匹配不匹配的位置存在于ISO-8859-1
  • @Lankymart 由于 UTF-8 具有比 ISO-8859-1 更大的字符集,这些映射问题是我所期望的。还是有其他解决方法?
  • 如果你意识到这一点,那你就成功了一半。你会惊讶于有多少人期望它能够工作。
  • 我想当谈到像这样的编码问题时,我一直想知道的是,为什么需要将UTF-8 数据转换为ISO-8859-1?通常它归结为一个遗留系统,其中有很多页面保存为Windows-1252,这被视为一种快速修复,从长远来看,提供从服务器到客户端的适当UTF-8 支持是可行的方法。
  • 在我的例子中,因为数据库是 UTF-8,而脚本文件保存在 ISO-8859-1 中。由于我正在处理的脚本是更大系统的一部分,并且我无法更改数据库编码,因此我必须获取字符串然后进行转换。如果您不需要重音字符来工作(就像应用只处理英语的情况一样),那么您可能不需要这样做,但在巴西,我们一直使用重音符号。
【解决方案2】:

为了扩展OP自身的自答,当从单字节字符集(如ISO-8859-1Windows-1251Windows-1252等...)转换为UTF-8时,有一些不必要的与ADODB 的字节数组相互转换的冗余。多个函数调用和转换的开销可以这样消除:

Const adTypeText = 2

Private Function AsciiStringToUTF8(AsciiString)
    Dim objStream: Set objStream = CreateObject("ADODB.Stream")
    Call objStream.Open()
    objStream.Type = adTypeText
    'Any single-byte charset should work in theory
    objStream.Charset = "Windows-1252"
    Call objStream.WriteText(AsciiString)
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    objStream.Position = 0
    objStream.Charset = "UTF-8"
    AsciiStringToUTF8 = objStream.ReadText()
    Call objStream.Close(): Set objStream = Nothing
End Function

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 2020-01-25
    • 2014-08-29
    • 2016-07-29
    • 1970-01-01
    • 2012-01-05
    • 2023-03-27
    • 2012-10-08
    相关资源
    最近更新 更多