{"id":88,"date":"2007-07-03T21:35:50","date_gmt":"2007-07-03T19:35:50","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/07\/03\/vc-2005-features-der-crt-fuer-unicode-unterstuetzung\/"},"modified":"2007-12-04T12:29:24","modified_gmt":"2007-12-04T11:29:24","slug":"vc-2005-features-der-crt-fuer-unicode-unterstuetzung","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/07\/03\/vc-2005-features-der-crt-fuer-unicode-unterstuetzung\/","title":{"rendered":"VC-2005 Features der CRT f\u00fcr Unicode Unterst\u00fctzung"},"content":{"rendered":"<p>Die <em>CRT<\/em> der <em>VC-2005 <\/em>hat eine\u00a0perfekte Unterst\u00fctzung f\u00fcr Unicode Dateien im <em>UTF-8 <\/em>und <em>UTF-16 <\/em>Little Endian Format.<\/p>\n<p>Wollte man bisher Unicode Dateien lesen, so mussten diese mit <em>_wfopen(&#8230;,L&#8220;rb&#8220;)<\/em> ge\u00f6ffnet werden und entsprechende Leseoperationen mussten folgen. Um Unicode und ANSI Dateien zu unterscheiden schrieb man selbst entsprechenden Code, der nach einer <em>BOM (Byte Order Mark) <\/em>schaut. Beim Schreiben hatte man auch selbst darauf zu achten die <em>BOM <\/em>entsprechend zu setzen.<\/p>\n<p>Ziemlich unbemerkt (auch von mir \ud83d\ude42 ), hat die <em>CRT <\/em>hier eine entscheidene Erweiterung erfahren. Mit dem folgenden Code l\u00e4sst sich gezielt jede Datei entsprechend \u00f6ffnen und lesen, sofern Sie \u00fcber eine korrekte <em>BOM <\/em>verf\u00fcgt, bzw. auch eine Datei zum Schreiben \u00f6ffnen die mit der entsprechenden <em>BOM <\/em>versehen wird.<\/p>\n<p class=\"ccode\">FILE *pFile = _tfopen(_T(&#8222;myfile.txt&#8220;),_T(&#8222;rt, ccs=UNICODE&#8220;));<\/p>\n<p>Ist die Datei eine ANSI Datei ohne BOM, wird sie entsprechend ge\u00f6ffnet. Unicode Dateien im Typ <em>UTF-8 <\/em>und <em>UTF-16 little endian <\/em>werden an der entsprechenden <em>BOM <\/em>erkannt und entsprechend gelesen.<br \/>\n\u00dcber <em>ccs=UTF-8 <\/em>bzw. <em>ccs=UTF-16LE <\/em>l\u00e4sst sich auch gezielt eine entsprechende Unicode Datei ohne <em>BOM <\/em>\u00f6ffnen. Eine vorhandene <em>BOM <\/em>\u00fcberschreibt allerdings die beim \u00d6ffnen angegebenen Formatierung. Fein!<\/p>\n<p>Leider hinkt die <em>MFC <\/em>diesen wirklich tollen Funktionen\u00a0der <em>CRT <\/em>hinterher. Weder die <em>MFC\u00a0\u00a08.0 <\/em>aus <em>VS-2005 <\/em>noch die neue <em>Orcas <\/em>Version (Stand Beta1) verf\u00fcgt \u00fcber eine neue Version der CStdioFile, die diese Funktionen der CRT abbildet.<\/p>\n<p>Gl\u00fccklicherweise gibt es einen entsprechenden <em>CStdioFile(FILE *) <\/em>Konstruktor. Dadurch ist es m\u00f6glich, einfach eine Datei mit <em>_tfopen <\/em>zu \u00f6ffnen und den Stream einfach an ein CStdioFile Objekt zu koppeln.<br \/>\nEinziger Sch\u00f6nheitsfehler: <em>CStdioFile::Close<\/em> muss explizit in diesem Fall aufgerufen werden, d. h. <em>Close<\/em> wird nicht durch den Destruktor aufgerufen.<br \/>\nF\u00fcr den MFC Kenner: <em>m_bCloseOnDelete<\/em> ist <em>FALSE <\/em>und leider <em>protected<\/em>. Dieses Flag verhindert, dass Close auch durch den Destruktor aufgerufen wird.<\/p>\n<p><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/yeby3zcb(VS.80).aspx\">MSDN Dokumentation zu _tfopen\/fopen\/_wfopen<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die CRT der VC-2005 hat eine\u00a0perfekte Unterst\u00fctzung f\u00fcr Unicode Dateien im UTF-8 und UTF-16 Little Endian Format. Wollte man bisher Unicode Dateien lesen, so mussten diese mit _wfopen(&#8230;,L&#8220;rb&#8220;) ge\u00f6ffnet werden und entsprechende Leseoperationen mussten folgen. Um Unicode und ANSI Dateien zu unterscheiden schrieb man selbst entsprechenden Code, der nach einer BOM (Byte Order Mark) schaut. &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/07\/03\/vc-2005-features-der-crt-fuer-unicode-unterstuetzung\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eVC-2005 Features der CRT f\u00fcr Unicode Unterst\u00fctzung\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":[19,4,3],"tags":[360,352,67],"class_list":["post-88","post","type-post","status-publish","format-standard","hentry","category-crt","category-mfc","category-programmieren","tag-crt","tag-mfc","tag-unicode"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/88","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=88"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/88\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=88"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=88"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=88"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}