2015-03-03 13 views
5

Ứng dụng ASP cổ điển của tôi truy xuất chuỗi UTF-8 từ cơ sở dữ liệu của nó, nhưng tôi cần chuyển đổi nó thành ISO-8859-1. Tôi không thể thay đổi mã HTML trang;Chuyển đổi chuỗi UTF-8 thành ISO-8859-1

Tôi thực sự chỉ cần chuyển đổi chuỗi đã tìm nạp. Tôi làm nó như thế nào?

+0

Cách tìm kiếm trang web này đã được bạn và người khác trả lời gấp mười lần! Chỉ cần duyệt phần ** Liên quan ** ở phía bên tay phải của câu hỏi này chẳng hạn. – Lankymart

+0

bản sao có thể có của [chuyển đổi utf-8 thành iso-8859-1 trong asp cổ điển] (http://stackoverflow.com/questions/17677180/convert-utf-8-to-iso-8859-1-in-classic- asp) – Lankymart

+0

@Lankymart Tôi đã nhìn thấy câu hỏi đó, nhưng các giao dịch trả lời của nó với toàn bộ tệp tập lệnh. Tôi muốn chuyển đổi một chuỗi có nguồn gốc trong một cơ sở dữ liệu, vì vậy nó thậm chí không được nêu rõ trong tệp đó. Tôi chỉ cần chuyển đổi một chuỗi duy nhất và giữ nguyên phần còn lại của tệp (ISO-8859-1). Nhưng tôi mới đến ASP cổ điển, và tôi có thể không nắm bắt được câu trả lời một cách chính xác. Với điều này làm rõ, bạn có tin rằng nó là như vậy? Nếu tôi sai, tôi sẽ yêu cầu làm rõ ý kiến ​​của câu trả lời đó. – Metalcoder

Trả lời

9

Tôi tìm thấy câu trả lời 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 

Vì vậy, tôi chỉ làm điều này:

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

Và nó làm việc độc đáo.

+0

Điều này sẽ hoạt động nhưng lưu ý nếu mã hóa nguồn của bạn là 'UTF-8' và bạn chuyển đổi thành' ISO-8859-1', bạn sẽ tùy thuộc vào các ký tự trong tập hợp ký tự UTF-8 không phù hợp khi chúng không ' t tồn tại trong 'ISO-8859-1'. – Lankymart

+0

@Lankymart Vì UTF-8 có một bộ ký tự lớn hơn ISO-8859-1, những vấn đề lập bản đồ đó là thứ tôi mong đợi. Hay có cách nào khác để giải quyết nó? – Metalcoder

+0

Không thực sự nếu bạn nhận thức được nó, đó là một nửa trận chiến. Bạn sẽ ngạc nhiên khi có bao nhiêu người mong đợi nó hoạt động. – Lankymart

0

Để mở rộng tự tự câu trả lời của OP, khi chuyển đổi từ bộ ký tự single-byte (như ISO-8859-1, Windows-1251, Windows-1252, vv ...) để UTF-8, có một số dư thừa không cần thiết trong việc chuyển đổi đến và đi trở lại từ Mảng byte của ADODB. Chi phí của nhiều cuộc gọi chức năng và chuyển đổi có thể được loại bỏ như vậy:

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 
Các vấn đề liên quan