2015-03-03 5 views
5

La mia applicazione ASP classica recupera una stringa UTF-8 dal suo database, ma ho bisogno di convertirla in ISO-8859-1. Non riesco a cambiare la codifica della pagina HTML;Converti la stringa UTF-8 in ISO-8859-1

Ho davvero bisogno di convertire solo la stringa scaricata. Come posso farlo?

+0

Per quanto riguarda la ricerca sul sito, questa è stata esaudita, dalla tua vera e da altre mille volte già! Ad esempio, sfoglia la sezione ** Related ** sul lato destro di questa domanda. – Lankymart

+0

possibile duplicato di [convertire utf-8 in iso-8859-1 in classico asp] (http://stackoverflow.com/questions/17677180/convert-utf-8-to-iso-8859-1-in-classic- asp) – Lankymart

+0

@Lankymart Ho visto questa domanda, ma la sua risposta riguarda l'intero file di script. Voglio convertire una stringa originata in un database, quindi non è nemmeno specificata in quel file. Devo convertire solo una singola stringa e mantenere il resto del file così com'è (ISO-8859-1). Ma io sono nuovo di ASP classico, e potrebbe non essere afferrando la risposta correttamente. Visto questo chiarimento, credi che sia così? Se sbaglio, chiederò chiarimenti sui commenti di quella risposta. – Metalcoder

risposta

9

ho trovato la risposta 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 

Così ho appena fatto questo:

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

e ha funzionato bene.

+0

Questo funzionerà, ma tieni presente che se la tua codifica sorgente è 'UTF-8' e ti converti in' ISO-8859-1', a seconda dei caratteri nel set di caratteri UTF-8, le discrepanze di hit non vengono accettate. Esistono in "ISO-8859-1". – Lankymart

+0

@Lankymart Poiché UTF-8 ha un set di caratteri più grande di ISO-8859-1, questi problemi di mappatura sono qualcosa che mi aspetto. O c'è un altro modo per aggirarlo? – Metalcoder

+0

Non proprio se ne sei a conoscenza, questa è metà della battaglia. Sareste sorpresi di quante persone si aspettano solo che funzioni. – Lankymart

0

Per espandere il proprio auto-risposta del PO, durante la conversione da set di caratteri a singolo byte (come ad esempio ISO-8859-1, Windows-1251, Windows-1252, ecc ...) per UTF-8, v'è una certa ridondanza inutile nella conversione di andata e ritorno da La matrice di byte di ADODB. Il sovraccarico delle chiamate e conversioni di più funzioni può essere eliminato in questo modo:

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