将UTF-8字符串转换为ISO-8859-1

6

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

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


不妨搜索一下这个问题已经被我和其他人无数次回答过的网站!例如,只需浏览此问题右侧的“相关”部分。 - user692942
@Lankymart,我看到了那个问题,但它的答案涉及整个脚本文件。我想要转换一个源自数据库的字符串,因此它甚至没有在该文件中明确说明。我只需要转换一个字符串,并保持文件的其余部分不变(ISO-8859-1)。但我对经典ASP还很陌生,可能没有正确理解答案。在这种情况下,您认为是这样吗?如果我错了,我会在那个答案的评论中请求澄清。 - Metalcoder
1
@Lankymart 我已经寻找这个答案好几天了,也在这里尝试过。相关的问题并没有什么用,因为它们主要涉及其他语言。我避免直接问,因为人们对新问题非常挑剔。在我访问的 StackExchange 网站上,有太多次我提出一个问题,必须努力保持我的问题开放。抱歉发牢骚。 - Metalcoder
1
我使用Google搜索,不加上“site:stackoverflow.com”来获取更广泛的结果。但它似乎比Stack Overflow的搜索功能更好用。谢谢。 - Metalcoder
显示剩余3条评论
2个回答

12

我在这里找到了答案:这里


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")

而且它运行得非常好。


@Lankymart 由于UTF-8字符集比ISO-8859-1更大,所以我预计会出现这些映射问题。或者还有其他解决方法吗? - Metalcoder
如果你意识到了这一点,那么问题就解决了一半。你会惊讶于有多少人只是期望它能够正常工作。 - user692942
我猜当涉及到像这样的编码问题时,我一直在想的是为什么需要将UTF-8数据转换为ISO-8859-1?通常情况下,这归结于具有许多页面保存为Windows-1252的遗留系统,并且被视为快速修复,在长期来看,从服务器到客户端提供适当的UTF-8支持是正确的方法。 - user692942
我多年来一直在Classic ASP中使用[tag:multilanguage]系统,相信我,如果你使用这样的方法,你会遇到问题,唯一的“真正”解决方法是通过修复应用程序中的编码(文件的编码和来自Classic ASP的响应)来支持UTF-8从而实现真正的[tag:localization],以便实现[tag:internationalization]。 - user692942
我同意你的观点。不幸的是,我现在不能更改编码,因为这会导致项目延迟,而我正面临着完成项目的很大压力。我打算在下一次迭代中进行更改。 - Metalcoder
显示剩余3条评论

1
为了详细说明原帖作者的自我回答,当从单字节字符集(如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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接