{"id":892,"date":"2011-08-22T19:20:13","date_gmt":"2011-08-22T17:20:13","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=892"},"modified":"2011-08-22T19:00:52","modified_gmt":"2011-08-22T17:00:52","slug":"oemtocharbuffw-macht-nicht-das-gleiche-wie-oemtocharbuffa-und-anschliesender-umwandlung-nach-unicode","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2011\/08\/22\/oemtocharbuffw-macht-nicht-das-gleiche-wie-oemtocharbuffa-und-anschliesender-umwandlung-nach-unicode\/","title":{"rendered":"OemToCharBuffW macht nicht das gleiche wie OemToCharBuffA und anschlie\u00dfender Umwandlung nach Unicode"},"content":{"rendered":"<p>Ein St\u00fcck Code in unserer Software behandelt Datenimport aus fremden Dateien. Nicht wenige alter DOS Programme erzeugen ja Daten im &#8222;OEM&#8220;-Zeichensatz (DBase etc.).<br \/>\nWir haben in der Vergangenheit immer streng die T-Notation verwendet und eigentlich sollte dies einen vor vielen \u00dcberraschungen bewahren. Aber Pustekuchen.<\/p>\n<p>Folgender Code sollte Daten aus einem OEM-Stream in einen <em>CString<\/em> umwandeln und eigentlich bin ich davon ausgegangen, dass das Ergebnis f\u00fcr Tabulatoren (&#8218;\\t&#8216;) und Zeilenschaltungen (&#8222;\\r\\n&#8220;) ergebnisneutral ist. D.h. in anderen Worten ich erwartete in dem String genauso viele Tabulatoren und Zeilenschaltungen vor wie nach der Konvertierung.<br \/>\nDie Umwandlung erfolgte mit solch einem St\u00fcck Code:<\/p>\n<pre lang=\"cpp\">CString strText;\r\n::OemToCharBuff(szText,CStrBuf(srText,len),len);<\/pre>\n<p>Sieht eigentlich harmlos aus. Allerdings musste ich feststellen, dass hier <em>OemToCharBuffA<\/em> und <em>OemToCharBuffW<\/em> ganz und gar nicht korrespondierende Ergebnisse liefern.<br \/>\nIn der Unicode Version, also in der Version die <em>OemToCharBuffW<\/em> verwendet, wurden Tabulatoren zu <em>0x25cb L&#8217;\u25cb&#8216;\u00a0wchar_t\u00a0<\/em> und Zeilenschaltungen zu\u00a0<em>0x266a L&#8217;\u266a&#8216;\u00a0wchar_t <\/em>und <em>0x25d9 L&#8217;\u25d9&#8216;\u00a0wchar_t!<\/em><\/p>\n<p>F\u00fchrt man jedoch zuerst eine Kovertierung in den &#8222;ANSI\/Windows\/8bit&#8220;-Zeichensatz durch und konvertiert anschlie\u00dfenend diesen ANSI-String nach Unicode, dann ist alles gut und so wie man es erwartet.<\/p>\n<p>Wer Lust hat das nachzubauen kann das mit dem folgenden Code. Wichtig sind eigentlich nicht die OEM-Umlaute sondern nur die Tab- und Zeilenschaltungen:<\/p>\n<pre lang=\"cpp\">const char szText[] = \"Dies ist ein OEM TestString\\r\\n\"\r\n       \"mit Zeilenschaltungen\\tund Tabs\\r\\n\"\r\n       \"und Umlauten:\\r\\n\"\r\n       \"\u017d=AE, \u2122=OE, \u0161=\u0161E\\r\\n\"\r\n       \"\u201e=ae, \u201d=oe, \u0081=ue, \u00e1=ss\";\r\nconst size_t len = sizeof(szText);\r\n\r\nCStringW strOut1;\r\n::OemToCharBuffW(szText,CStrBufW(strOut1,len),len);\r\nCStringA strOut2;\r\n::OemToCharBuffA(szText,CStrBufA(strOut2,len),len);\r\nCStringW strOut3(strOut2);\r\n\r\n_ASSERT(strOut1.Compare(strOut3)==0); \/\/ Das sollte eigentlich gleich sein<\/pre>\n<p lang=\"cpp\">PS: Getestet habe ich das auf einem <em>Windows 7<\/em> 64bit und 32bit OS.<\/p>\n<p lang=\"cpp\">Siehe folgende Links zu den Begriffen OEM\/ANSI:<br \/>\n<a href=\"http:\/\/blogs.msdn.com\/b\/oldnewthing\/archive\/2005\/10\/27\/485595.aspx\">http:\/\/blogs.msdn.com\/b\/oldnewthing\/archive\/2005\/10\/27\/485595.aspx<br \/>\n<\/a><a href=\"http:\/\/blogs.msdn.com\/b\/oldnewthing\/archive\/2005\/03\/08\/389527.aspx\">http:\/\/blogs.msdn.com\/b\/oldnewthing\/archive\/2005\/03\/08\/389527.aspx<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein St\u00fcck Code in unserer Software behandelt Datenimport aus fremden Dateien. Nicht wenige alter DOS Programme erzeugen ja Daten im &#8222;OEM&#8220;-Zeichensatz (DBase etc.). Wir haben in der Vergangenheit immer streng die T-Notation verwendet und eigentlich sollte dies einen vor vielen \u00dcberraschungen bewahren. Aber Pustekuchen. Folgender Code sollte Daten aus einem OEM-Stream in einen CString umwandeln &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2011\/08\/22\/oemtocharbuffw-macht-nicht-das-gleiche-wie-oemtocharbuffa-und-anschliesender-umwandlung-nach-unicode\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eOemToCharBuffW macht nicht das gleiche wie OemToCharBuffA und anschlie\u00dfender Umwandlung nach Unicode\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,3,2],"tags":[370,67,61],"class_list":["post-892","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","category-windows-api","tag-c","tag-unicode","tag-winapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/892","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=892"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/892\/revisions"}],"predecessor-version":[{"id":894,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/892\/revisions\/894"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=892"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=892"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=892"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}