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

时间:2015-03-03 14:37:54

标签: string vbscript asp-classic character-encoding

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

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

2 个答案:

答案 0 :(得分:9)

我找到了答案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")

它运作良好。

答案 1 :(得分:0)

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

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