Unicode UTF-16LE
-
Hi,
in meinen Projekteinstellungen VS verwende ich Unicode; Jetzt möchte ich gern einen Cstring, welcher einen Response Header für das Http Protokoll beinhaltet, per Socket rausschicken an den Web-Browser.
Schau ich mir den Stream an, welcher anschließend über den Socket rausgeschickt wird (mit Wireshark), ist dieser UTF-16LE kodiert. Wird anscheinend per Default bei der Unicode-Einstellung verwendet. Das Problem jetzt ist, dass der Web-Browser (wie Firefox) mir die Homepage nicht anzeigt,
//ausgabestream in bytes 0x48 0x00 0x54 0x00 0x54 0x00 0x50 0x00 0x2F 0x00
weil der Browser anscheinend UTF-16LE nicht versteht. Ich übertrage einen entsprechenden Content-Type Header mit der Information text/html; charset=UTF-16LE - aber das zeigt keinerlei Wirkung. Hab auch schon probiert diese Information im Html-File unterzubringen - auch keine Wirkung.
<?xml version="1.0" encoding="utf-16le"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Beschreibung der Seite</title> </head> <body> </body> </html>
Verwende ich als Einstellung im VS nicht unicode sondern multibyte code, dann funktioniert alles einwandfrei, da jedes Byte dann "eine neue Information" beinhaltet. Allerdings soll die Page auch in Russisch dargstellt werden können, und somit reichen mir 8bit zur Darstellung nicht aus.
Gruß
Jakob
-
Jakob Hofmann schrieb:
Ich übertrage einen entsprechenden Content-Type Header mit der Information text/html; charset=UTF-16LE - aber das zeigt keinerlei Wirkung.
Wie sind denn Deine Header codiert? Wenn die auch schon UTF16 sind, wundert's mich nicht. Versuch mal, die in US-ASCII zu versenden.
-
Ich übertrage einen entsprechenden Content-Type Header mit der Information text/html; charset=UTF-16LE - aber das zeigt keinerlei Wirkung.
Ich habe nach einigen Versuchen meine Internetseiten in UTF-8 codiert. Das funktioniert mit allen gängigen Browsern einwandfrei, auch Russisch und Chinesisch ist kein Problem.
- Richard
-
[quote="Calando
Ich habe nach einigen Versuchen meine Internetseiten in UTF-8 codiert. Das funktioniert mit allen gängigen Browsern einwandfrei, auch Russisch und Chinesisch ist kein Problem.
- Richard[/quote]Über Tipps wäre ich dankbar, weil bis jetzt läuft es nicht;
CString tester2 = _T("ю"); UINT size = tester2.GetLength(); CStringA utf8; int len = WideCharToMultiByte(CP_UTF8, 0, tester2.GetString(), -1, NULL, 0, 0, 0); char *ptr = utf8.GetBuffer(len-1); if (ptr) WideCharToMultiByte(CP_UTF8, 0, tester2.GetString(), -1, ptr, len, 0, 0); utf8.ReleaseBuffer();
Leider funktioniert dieser Code nicht; das Cyrillic-Zeichen mit 0x044E wird in utf-8 nicht mit 0x04 0x4E oder ähnlichem dargestellt, sondern erhält eine komplett andere Hex-Kennzeichnung.
Meine html-Resource ansich hab ich als UTF-8 (ohne Signatur) in VS abgespeichert, öffnen tut sie Windows mit UTF-16LE.
Gruß
Jakob
-
SG1!@home schrieb:
Jakob Hofmann schrieb:
Ich übertrage einen entsprechenden Content-Type Header mit der Information text/html; charset=UTF-16LE - aber das zeigt keinerlei Wirkung.
Wie sind denn Deine Header codiert? Wenn die auch schon UTF16 sind, wundert's mich nicht. Versuch mal, die in US-ASCII zu versenden.
Die Header werden mit der Methode WideCharToMultiByte in UTF-8 konvertiert und daher auch entsprechend richtig dargestellt. Lediglich die Daten werden nicht richtig dargestellt, sobald Cyrillic-Zeichen oder ähnliches vorhanden sind. Hier scheint die Funktion WideCharToMultiByte nicht richtig zu funktionieren.
-
hier mal ein kleines Bsp:
http://en.wikipedia.org/wiki/Cyrillic_(Unicode_block)
Wenn ich den Character mit dem Code 0411 auf dieser Seite umwandle, dann bekomm ich im utf-8 format "0xC3 0x90 0xE2 0x80 0x98"
-
Jakob Hofmann schrieb:
Leider funktioniert dieser Code nicht; das Cyrillic-Zeichen mit 0x044E wird in utf-8 nicht mit 0x04 0x4E oder ähnlichem dargestellt, sondern erhält eine komplett andere Hex-Kennzeichnung.
Das ist normal.
Jakob Hofmann schrieb:
hier mal ein kleines Bsp:
http://en.wikipedia.org/wiki/Cyrillic_(Unicode_block)
Wenn ich den Character mit dem Code 0411 auf dieser Seite umwandle, dann bekomm ich im utf-8 format "0xC3 0x90 0xE2 0x80 0x98"Das wiederum nicht. 0x0411 sollte in UTF8 0xD091 ergeben, 0x044E 0xD1AE. Falls ich mich jetzt nicht verrechnet hab.
-
[quote="SG1]Das wiederum nicht. 0x0411 sollte in UTF8 0xD091 ergeben, 0x044E 0xD1AE. Falls ich mich jetzt nicht verrechnet hab.[/quote]
Wie wird das denn berechnet? In erster Linie verwundert es mich, dass ich mehr als zwei Zeichen bekomme für ein Cyrillic-Zeichen
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Beschreibung der Seite</title> </head> <body> Б </body> </html>
Und für die Zeile "Б" erhalte ich dann im Hex-Format :(c390e28098 0d0a); die letzten beiden Zeichen sind klar. Das versteh ich gar nicht. Anschauen tu ich mir die Daten (Hex-Format) mit dem Wireshark.
Gruß
Jakob
-
Bin etwas weiter gekommen; also die Funktion WideCharToMultiByte scheint zu funktionieren im ersten Fall aber nicht im zweiten Fall;
Fall1:
CStringW tester2 = _T("Б"); CStringA utf8 = UTF16toUTF8(tester2);
Hier bekomm ich die von dir genannten 0xD0 0x90
LPSTR lpcHtml = static_cast<LPSTR>(LockResource(hHeader)); rString = CStringW(lpcHtml); CStringA utf8 = UTF16toUTF8(rString);
Hier leider nicht... d.h. hier läuft etwas grundlegendes schief. Leider seh ich den Fehler so nicht...
Gruß
Jakob
-
also hier liegt der Fehler auf jeden Fall begraben
LPSTR lpcHtml = static_cast<LPSTR>(LockResource(hHeader)); rString = CStringW(lpcHtml); UINT pos1 = rString.GetAt(0); //liefert 208 (ist richtig) UINT pos2 = rString.GetAt(1); //liefert 8216 (ist leider falsch)... CStringA utf8 = UTF16toUTF8(rString);
Wenn ich mir die test.html Datei im Hex-Editor anschaue, dann steht auch 0xD0 0x91 drinnen... Was muss ich schreiben, damit die Datei richtig importiert wird in VS?
-
Jakob Hofmann schrieb:
SG1 schrieb:
Das wiederum nicht. 0x0411 sollte in UTF8 0xD091 ergeben, 0x044E 0xD1AE. Falls ich mich jetzt nicht verrechnet hab.
Wie wird das denn berechnet?