{"id":55000280,"date":"2015-06-01T00:00:00","date_gmt":"2020-01-24T15:59:21","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=280"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kodierte_Texte_mit_VBA_umwandeln","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html","title":{"rendered":"Kodierte Texte mit VBA umwandeln"},"content":{"rendered":"<p class='introduction'>Auch wenn die Assistenten von Access zum Import und Export von Textdateien &uuml;ber ihre Einstellungsseiten gen&uuml;gend M&ouml;glichkeiten bieten, um mit allen erdenklichen Formaten zurechtzukommen, gibt es h&auml;ufig Situationen, in denen die Verarbeitung &uuml;ber VBA-Programmierung ben&ouml;tigt wird. Hier geht es in erster Linie um den Umgang mit Texten in unterschiedlicher Sprachkodierung.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1503_Textumwandlung.mdb<\/b>.<\/p>\n<h2>Sprachen, Codepages, CharacterSets<\/h2>\n<p>Beleuchten wird zun&auml;chst, was es mit den Sprachcharakteristiken von Textdateien auf sich hat. Wenn Sie sich eingehender mit Textformaten besch&auml;ftigen &#8211; Stichwort Internationalisierung -, so begegnen Sie immer wieder Begriffen, wie <b>Language Id<\/b>, <b>Locale Identifier<\/b> (<b>LCID<\/b>), <b>Codepage<\/b>, <b>Unicode<\/b> und <b>Character Set<\/b>. Jeder hat seine eigene Bedeutung und doch h&auml;ngen alle irgendwie miteinander zusammen. Grunds&auml;tzlich geht es dabei nicht nur um Textdateien, sondern generell um den Umgang mit Texten im System. Betroffen sind damit etwa die Tastatur, die Textausgabe auf dem Bildschirm, Schriftarten, oder auch die Interaktion mit dem Internet.<\/p>\n<p>An oberster Stelle steht die Sprache eines Textes, die wiederum einer Gruppe von Sprachen angeh&ouml;ren kann. Deutsch etwa geh&ouml;rt zur Gruppe <b>Westeuropa und USA<\/b>. Windows unterst&uuml;tzt von Haus aus mehrere Sprachgruppen und Sprachen. Dabei gibt es einen Unterschied zwischen nur unterst&uuml;tzten und den installierten Sprachen. W&auml;hrend es genau 17 Gruppen gibt, kann die Zahl der zugeh&ouml;rigen Sprachen selbst variieren. F&uuml;r den Umgang mit Texten ist die Gruppierung weniger interessant, denn sie betrifft vor allem die Tastaturbelegung, die in der Regel pro Sprachgruppe eindeutig ist.<\/p>\n<p>Welche Sprachen Windows unterst&uuml;tzt k&ouml;nnen Sie mit einem Doppelklick auf die Tabelle <b>tblLCIDs<\/b> der Beispieldatenbank herausfinden (siehe Bild 1). In der zweiten Spalte finden Sie die Sprache, in der dritten das zugeh&ouml;rige Land. Auf die Bedeutung der vierten (<b>CP<\/b>) kommen wir noch zu sprechen. Das Feld <b>LCID<\/b> legt die eindeutige Id der Sprache fest. Diese Zahl werden Sie h&auml;ufiger unter Windows finden. Schauen Sie etwa in den Order von <b>Microsoft Office<\/b> im Explorer zu Ihrer Office-Version. Dort werden Sie als Unterverzeichnisse die von Ihrem Office unterst&uuml;tzten Sprachen als <b>LCID<\/b> finden. Die <b>1033<\/b> f&uuml;r <b>Englisch (USA<\/b>) ist immer mit dabei, die <b>1031<\/b> f&uuml;r Deutsch wahrscheinlich auch. In diesen Verzeichnissen befinden sprachspezifische Ressourcen f&uuml;r Office. Installieren Sie etwa zus&auml;tzlich die Rechtschreibpr&uuml;fung f&uuml;r Franz&ouml;sisch, so entsteht hier ein weiterer Ordner mit dem Namen <b>1036<\/b>.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/VBA_tblLCIDs.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/VBA_tblLCIDs.png\" alt=\"Inhalt der Tabelle tblLCIDs mit den von Windows unterst&uuml;tzten Sprachen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Inhalt der Tabelle tblLCIDs mit den von Windows unterst&uuml;tzten Sprachen<\/p>\n<p>Ist die Sprache mit ihrer <b>LCID<\/b> noch eindeutig, so ist es das Land nicht. Filtern Sie die Tabelle nach dem  Land <b>Deutschland<\/b>, so ergeben sich vier Datens&auml;tze, unter denen sich etwa auch das sehr spezielle <b>Niedersorbisch<\/b> befindet.<\/p>\n<p>Der Inhalt dieser Tabelle ist keineswegs in Stein gemei&szlig;elt. Je nach Windows-Version, -Installationsoptionen und -Sprache kann sie andere Datens&auml;tze aufweisen. Sie k&ouml;nnen die Tabelle auf Ihrem System selbst erstellen. Dazu gibt es im VBA-Modul <b>mdlTextconverter<\/b> der Beispieldatenbank eine Prozedur <b>EnumLanguageGroupsLocales<\/b>. die Sie aus dem Direktfenster des VBA-Editors heraus aufrufen k&ouml;nnen. Sie l&ouml;scht zun&auml;chst den Inhalt der Tabelle und erstellt ihn dann &uuml;ber verschiedene API-Funktionen neu. Es gibt allerdings keine API-Funktion, die die Sprachen direkt  aufz&auml;hlen k&ouml;nnte. Erst m&uuml;ssen die einzelnen Sprachgruppen ermittelt (<b>EnumLanguageGroups<\/b>), in einer Collection zwischengespeichert und anschlie&szlig;end der Sprach-Enumeration &uuml;bergeben werden. In Listing 1 sehen Sie den Code der Prozedur, der hier nur exemplarisch angef&uuml;hrt wird.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>EnumLanguageGroupsLocales()\r\n     <span style=\"color:blue;\">Dim <\/span>vID<span style=\"color:blue;\"> As Variant<\/span>\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> colInfo = <span style=\"color:blue;\">New<\/span> VBA.Collection\r\n     CurrentDb.Execute \"DELETE FROM tblLCIDs\"\r\n     CurrentDb.Execute \"INSERT INTO tblLCIDs(LCID,Language,Country,CP) \" & _\r\n         \"VALUES (0,'(Unbekannt)','(Unbekanntes Land)',0)\"\r\n     \r\n     EnumLanguageGroups\r\n     For Each vID In colInfo\r\n         EnumLanguageGroupLocales AddrOf(AddressOf LanguageGroupLocalesProc), _\r\n             ByVal CLng(Val(\"&H\" & vID)), ByVal 0&, 0&\r\n     <span style=\"color:blue;\">Next<\/span> vID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 1: Prozedur zum F&uuml;llen der Tabelle tblLCIDs mit Sprachdatens&auml;tzen<\/p>\n<p>Denn im Rahmen dieses Beitrags w&uuml;rde es eindeutig zu weit f&uuml;hren, die nicht unkomplizierten und mit API-Aufrufen gespickten Funktionen n&auml;her zu erl&auml;utern. Und ohne API-Funktionen kommt man allein mit den Bordmitteln der VBA-, Access- und Office-Bibliotheken bei diesem Thema nicht weiter.<\/p>\n<p>Kommen wir zu der vierten Spalte der Tabelle mit dem Namen <b>CP<\/b>, was ein K&uuml;rzel f&uuml;r <b>Codepage<\/b> darstellt. Dort ist zu jeder Sprache die Vorgabe-<b>Codepage<\/b> zu finden. Was aber ist eine <b>Codepage<\/b> Dazu ein Ausflug in die bin&auml;re Speicherung von Texten: F&uuml;r jedes Zeichen wird bei Single-Byte-Formaten (<b>ANSI, OEM<\/b>) genau ein Byte festgelegt. Schreiben Sie ein <b>A<\/b> in einen Text, so finden Sie unter einem Hex-Editor an dieser Stelle die Zahl 65. Genauso gut k&ouml;nnen Sie auch VBA bem&uuml;hen:<\/p>\n<pre>  Asc (\"A\")   -> 65\r\n Chr (65) -> \"A\"<\/pre>\n<p>Die <b>65 <\/b>kennzeichnet, welches Zeichen innerhalb der deutschen Sprach-Codepage zu finden ist. Eine <b>Codepage<\/b> ist damit imgrunde eine Tabelle mit 255 Datens&auml;tzen, die jeder Position ein bestimmtes Zeichen zuordnet. Und eben diese Position ist, je nach Sprache, unterschiedlich.  So ermitteln Sie etwa f&uuml;r ein <b>&uuml;<\/b> den Code <b>220<\/b>. In Russland aber kennt man kein <b>&uuml;<\/b>. Die dort verwendete <b>Codepage<\/b> ordnet der 220 ein anderes, ein kyrillisches Zeichen zu. Ein Text in deutscher Sprache mit Umlauten wird dort falsch dargestellt, wenn er mit dem russischen <b>Notepad<\/b> ge&ouml;ffnet wird. Ein russisches <b>Word<\/b> hingegen wird beim &ouml;ffnen der Textdatei nachfragen, welche <b>Codepage<\/b> zu verwenden ist, und erst nach Einstellung von <b>Westeuropa (Windows)<\/b> das korrekte Ergebnis zeitigen.<\/p>\n<p>Die <b>Codepage<\/b> ist also die zentrale Schaltstelle, wenn es um Textverarbeitung geht. Erst sie erm&ouml;glicht es, einem Byte-Code ein bestimmtes Zeichen zuzuordnen.<\/p>\n<p>Nun braucht es nicht f&uuml;r jede einzelne Sprache eine gesondert Codepage. Die <b>ANSI<\/b>&#8211;<b>Codepage<\/b> f&uuml;r Westeuropa (<b>1252<\/b>) etwa kennt fast alle ben&ouml;tigten Zeichen f&uuml;r die Sprachen Europas, also die deutschen Umlaute und die franz&ouml;sischen oder spanischen Akzente.<\/p>\n<p>Es ist demnach &ouml;konomischer, mehreren Sprachen eine Codepage zuzuweisen. So steht in der <b>CP<\/b>-Spalte der Sprachtabelle f&uuml;r Deutsch, Italienisch, Franz&ouml;sisch, Spanisch, Englisch &uuml;berall die <b>1252<\/b>. Filtern Sie die Tabelle nach diesem Wert: Erstaunlicherweise gibt es &uuml;ber Hundert Sprachen, die sich diese <b>Codepage<\/b> teilen.<\/p>\n<p>Nun kann man sich eine Zahl als Bezeichner f&uuml;r eine <b>Codepage<\/b> nur schwer merken. Deshalb haben Codepages auch Namen. &ouml;ffnen Sie die Tabelle <b>tblCodepages<\/b> der Beispieldatenbank (siehe Bild 2). Sie finden dort unter dem Feld <b>Description<\/b> die Bezeichnungen der <b>Codepages<\/b>. Die <b>1251<\/b> nennt sich exakt <b>ANSI &#8211; Lateinisch I<\/b>. Das ist gut zu wissen, denn eine Bezeichnung mit dem Teilinhalt <b>Westeuropa<\/b> werden Sie n&auml;mlich vergeblich suchen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/VBA_tblCodepages.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/VBA_tblCodepages.png\" alt=\"Inhalt der Tabelle tblCodepages\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Inhalt der Tabelle tblCodepages<\/p>\n<p>In der Tabelle sind allerlei kryptische <b>Codepages<\/b> aufgef&uuml;hrt, die zum gro&szlig;en Teil veraltet und nicht mehr in Gebrauch sind.<\/p>\n<p>Sie werden sie unter Umst&auml;nden dennoch ben&ouml;tigt, wenn Sie es mit Textdateien zu tun haben, die aus IT-Urzeiten stammen, wie die <b>IBM<\/b>-Codes. Eher noch treffen Sie auf Texte von MS-DOS-Systemen, die in der Tabelle durch das Pr&auml;fix <b>OEM<\/b> gekennzeichnet sind.<\/p>\n<p>Es gibt &uuml;berdies ein Problem mit diesen Bezeichnungen, die leider nicht so eindeutig sind. Die Bezeichnungen in der Tabelle sind das Resultat einer Windows-API-Funktion, die in der Prozedur <b>GetCPName<\/b> der Beispieldatenbank zum Einsatz kommt:<\/p>\n<pre>  GetCPName (1252) \r\n- > \"(ANSI - Lateinisch I)\"<\/pre>\n<p>Mithilfe dieser Prozedur und derjenigen zum Auflisten der <b>Codepages<\/b> (<b>EnumCodepages<\/b>), aufgerufen aus dem VBA-Direktfenster, k&ouml;nnen Sie den Inhalt der Tabelle neu erstellen. Wie wir noch sehen werden, gibt es aber auch noch die M&ouml;glichkeit, sich &uuml;ber <b>DAO<\/b> und die <b>Access Database Engine<\/b> alle <b>Codepages<\/b> ausgeben zu lassen. Dieses Ergebnis gibt die Tabelle <b>tblCodepagesDAO<\/b> wieder. Und dort steht f&uuml;r die <b>Codepage<\/b> <b>1252<\/b> die Bezeichnung <b>Westeurop&auml;isch (Windows)<\/b>. Damit Sie alle Sprachen, die zugeh&ouml;rigen <b>Default-Codepages<\/b> und deren Bezeichnungen im Blick haben, fasst die Abfrage <b>qry_LCID_CP<\/b> die drei besprochenen Tabellen zusammen und gibt sie wie in Bild 3 wieder. Sie sollte gen&uuml;gen, um aus einer Bezeichnung die zugeh&ouml;rige Codepage zu identifizieren. Denn diese Bezeichnungen listen etwa die Kombinationsfelder von Access oder Word auf, wenn es um die Auswahl einer <b>Codepage<\/b> geht.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/VBA_qry_LCID_CP.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/VBA_qry_LCID_CP.png\" alt=\"Alle Sprachen und deren Codepages gibt die Abfrage qry_LCID_CP aus\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Alle Sprachen und deren Codepages gibt die Abfrage qry_LCID_CP aus<\/p>\n<p>Zuletzt fehlt noch die Erl&auml;uterung des Begriffs <b>Character Set<\/b>, zu Deutsch Zeichensatz. Die Zuordnung der Bytes eines Textes zu bestimmten Zeichen &uuml;ber die Codepage ist das Eine, die visuelle Darstellung dieses Zeichens &uuml;ber Schriften das Andere. Eine Schriftart kann mit der Codepage allein noch nichts anfangen. Der Satz von darstellbaren Zeichen ist durch den Zeichensatz definiert. Die wiederum ist ebenfalls &uuml;ber eine bestimmte Nummer gekennzeichnet. Die Funktion <b>CharSetFromCP<\/b> der Beispieldatenbank nimmt als Parameter eine Codepage entgegen und gibt die ID des zugeh&ouml;rigen Zeichensatzes zur&uuml;ck:<\/p>\n<pre>  CharSetFromCP(1252)\r\n  -> 0 (Deutsch, System-Zeichensatz)\r\n  CharSetFromCP(1251)\r\n -> 204 (Russisch, Kyrillisch)<\/pre>\n<p>Das Ergebnis 0 bedeutet, dass es sich um den Vorgabezeichensatz des installierten Systems handelt. Um kyrillische Zeichen darzustellen, ben&ouml;tigen Sie das CharacterSet 204. <\/p>\n<p>Die Standardschriftarten von Windows, wie <b>Arial<\/b>, <b>Times New Roman<\/b>, <b>Courier New<\/b>, et cetera, enthalten alle diese Zeichen. Die Nummer des Zeichensatzes identifiziert dann, welcher Block von Zeichen zu verwenden ist.<\/p>\n<h2>Unicode<\/h2>\n<p>Bisher ging es nur im Texte im <b>Single-Byte-Format<\/b>, wobei <b>ANSI<\/b> der Standard ist. Die Beschr&auml;nkung auf 256 m&ouml;gliche Zeichen durch ein Byte f&uuml;hrt hier zum beschriebenen System mit den <b>LCIDs<\/b> und <b>Codepages<\/b>, welches einige Kopfschmerzen bereiten kann. Um einiges angenehmer ist da das <b>Unicode<\/b>-Format, das jedem Zeichen mehrere Bytes spendieren kann.<\/p>\n<p>Bei <b>UTF-16<\/b> sind das pro Zeichen in der Regel zwei Bytes. Dadurch steigt die Zahl zuordenbarer Zeichen auf 2^16, was f&uuml;r alle Zeichen dieser Welt ausreicht. Um <b>Codepages<\/b> m&uuml;sste man sich im Prinzip keine Gedanken mehr machen, wenn alle Texte in diesem Format gespeichert w&auml;ren. Allerdings bedeutet diese Erweiterung noch nicht, dass damit auch die Sprache des Textes bekannt ist und welcher Zeichensatz zur Darstellung kommen soll. Insofern beh&auml;lt das System um <b>LCIDs<\/b>, <b>Codepages<\/b> und <b>Charactersets<\/b> weiterhin seine Bedeutung.<\/p>\n<p>Bei <b>UTF-8 <\/b>wird es komplizierter, weil ein Zeichen meist ein Byte belegt, aber bei spezielleren Zeichen bis zu vier. Der Beginn eines Mehr-Byte-Zeichens wird durch bestimmte Flag-Bytes eingeleitet.<\/p>\n<p>Dasselbe gilt f&uuml;r das wenig verbreitete <b>UTF-7<\/b>, welches eine noch komplexere Kodierung vorsieht, denn ein Zeichen wird hier durch nur 7 Bits eines Bytes identifiziert. Infolgedessen sind speziellere Zeichen durch eine ganze Kette von Byte-Anweisungen repr&auml;sentiert.<\/p>\n<p>Eigentlich ist das <b>UTF-8<\/b>-Format das optimalste, weil es alle Zeichen darstellen kann, aber wenig Platz ben&ouml;tigt. Weil es jedoch durch variable Byte-Anzahl pro Zeichen etwas schwieriger zu handhaben ist, verwendet VBA ausschlie&szlig;lich das <b>UTF-16<\/b>-Format. Tats&auml;chlich sind alle Strings unter VBA solche Unicode-Strings. Das l&auml;sst sich leicht nachweisen. W&auml;hrend die Funktion <b>Len<\/b> die Zahl der Zeichen eines Strings zur&uuml;ckgibt, ermittelt <b>LenB<\/b> die Anzahl der Bytes, die daf&uuml;r ben&ouml;tigt werden. Sie gibt grunds&auml;tzlich das Doppelte aus:<\/p>\n<pre>  <span style=\"color:blue;\">Len<\/span> (\"ACCESS\")  -> 6\r\n LenB (\"ACCESS\") ->12<\/pre>\n<p>Intern steht dieser Text mit diesen Bytes im Speicher:<\/p>\n<pre>65 - 0 - 67 - 67 - 0 - 69 - 0 - 83 -0 - 83 - 0<\/pre>\n<p>Das macht auch schon deutlich, dass <b>UTF-16<\/b> zur Speichervergeudung neigt. Der h&auml;ufigste Wert in diesen Strings ist 0. Da Strings in Textfeldern seit Access 2000 ebenfalls grunds&auml;tzlich in UTF-16 gespeichert sind, sieht Access die M&ouml;glichkeit vor, f&uuml;r diese Felder als Eigenschaft die Unicode-Kompression einzuschalten, um Speicherplatz zu sparen. Die Kompression elimiert die ganzen Nullen und f&uuml;hrt intern zu einem Format, das UTF-8 &auml;hnelt.<\/p>\n<p>Es gibt also einige Varianten von <b>Unicode<\/b>, und bei Unicode-Textdateien kommt noch ein weiterer Stolperstein hinzu. Es gibt zum einen solche Dateien, die die Bytes vertauschen. Der String oben sieht dann so aus:<\/p>\n<pre>0 - 65 - 0 - 67 - 67 - 0 - 69 - 0 - 83 -0 - 83 <\/pre>\n<p>Hier handelt es sich um die LE-Variante (<b>Low Endian<\/b>), w&auml;hrend VBA die BE-Variante (<b>Big Endian<\/b>) nutzt. Zum anderen kann eine Unicode-Datei noch sogenannte <b>Lead-Bytes<\/b> ganz zu Anfang beherbergen, die sie eindeutig als im Unicode-Format kodiert kennzeichnen soll. Das ist im Allgemeinen die Byte-Folge 255, 254 oder 254, 255, je nachdem, ob es sich um <b>Big Endian<\/b> oder <b>Low Endian <\/b>handelt. Bei <b>UTF-8<\/b> stehen hier sogar 3 <b>Lead-Bytes<\/b>.<\/p>\n<p>All dies macht klar, dass auch Textdateien im Unicode-Format Probleme bescheren k&ouml;nnen. Damit VBA mit Strings korrekt umgehen kann, m&uuml;ssen diese immer in UTF-16 vorliegen. Auch alle Steuerelemente, etwa die Textbox, erwarten dieses Format, sonst kommt es zu seltsamen Zeichenfolgen. <\/p>\n<h2>Texte konvertieren<\/h2>\n<p>Die wichtigste VBA-Funktion zur Umwandlung von <b>ANSI<\/b> in <b>Unicode<\/b> und zur&uuml;ck ist <b>StrConv<\/b>:<\/p>\n<pre>  StrConv (\"ACCESS\", vbUnicode)\r\n-> \"A C C E S S\"\r\n  StrConv (\"ACCESS\", vbFromUnicode)\r\n-> \"\"<\/pre>\n<p>Da der &uuml;bergebene String bereits im Unicode-Format vorliegt, verdoppelt VBA nicht nur das Zeichen-Byte, sondern auch die interne Null, was zu drei Nullen f&uuml;hrt, die als Leerzeichen ausgegeben werden. Umgekehrt bildet sich bei der Konvertierung aus Unicode nach ANSI zwar eine g&uuml;ltige Byte-Folge, die aber von VBA nicht angezeigt werden kann, was durch die Fragezeichen deutlich wird. Kombinieren Sie beide Funktionen, so erhalten Sie ein sinnvolles Ergebnis und den Nachweis, dass bei der Konvertierung nach ANSI nichts verloren ging:<\/p>\n<pre>  StrConv(StrConv(\"ACCESS\", _         vbFromUnicode),vbUnicode)\r\n- > \"ACCESS\"<\/pre>\n<p>Eine Besonderheit von <b>StrConv<\/b> ist, dass es nicht nur Strings als Parameter entgegennimmt, sondern auch Byte-Arrays. Oder aus Byte-Arrays wieder Strings erzeugen kann:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>bin()<span style=\"color:blue;\"> As Byte<\/span>\r\nbin = StrConv(\"ACCESS\", vbFromUnicode)\r\n  <span style=\"color:blue;\">UBound<\/span>(bin)  '-> 5 = 6 Bytes\r\n  StrConv(bin, vbUnicode)\r\n-> \"ACCESS\"<\/pre>\n<p>&uuml;ber Byte-Arrays k&ouml;nnen Strings so am einfachsten manipuliert werden.<\/p>\n<p>Ein weiterer Parameter von <b>StrConv<\/b>, der optional angegeben werden kann, ist <b>LCID<\/b>. Damit kann eine Sprache festgelegt werden, in die der String konvertiert werden soll und umgekehrt. Das macht es m&ouml;glich einen String von einer Sprach-Id in die andere umzuwandeln. Die Funktion <b>ConvertUnicodeToUnicode<\/b> (Listing 2) der Beispieldatenbank macht sich das zunutze. Hier wird aus dem &uuml;bergebenen Text zun&auml;chst ein Byte-Array erzeugt. Dabei wird der Parameter <b>LCID<\/b> weggelassen, was bedeutet, dass <b>StrConv<\/b> die Sprach-Id des Systems verwendet und damit einen westeurop&auml;ischen Text. Beim Zur&uuml;ckverwandeln in einen String als R&uuml;ckgabe der Funktion jedoch wird die <b>LCID<\/b> eingesetzt, die als optionaler Parameter &uuml;bergeben wurde. Rufen Sie die Funktion etwa so auf:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ConvertUnicodeToUnicode(ByVal sText<span style=\"color:blue;\"> As String<\/span>, _\r\n     <span style=\"color:blue;\">Optional<\/span> lLCID<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bin()<span style=\"color:blue;\"> As Byte<\/span>\r\n     \r\n     <span style=\"color:blue;\">On Error GoTo<\/span> Fehler\r\n     <span style=\"color:blue;\">If <\/span>lLCID = 0<span style=\"color:blue;\"> Then<\/span> lLCID = GetSystemDefaultLangID\r\n     bin = StrConv(sText, vbFromUnicode)\r\n     ConvertUnicodeToUnicode = StrConv(bin, vbUnicode, lLCID)\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n     \r\nFehler:\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Ung&uuml;ltige Sprach-ID (LCID)\", <span style=\"color:blue;\">vbCr<\/span>itical\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p class='imagetext'>Listing 2: Funktion zum Konvertieren eines Textes mithilfe einer Sprach-ID  (LCID)<\/p>\n<pre>  ConvertUnicodeToUnicode( _ \r\n\"Andr&eacute;\",1031)<\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000280\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000280?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000280\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"cd6c93d13a\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Auch wenn die Assistenten von Access zum Import und Export von Textdateien &uuml;ber ihre Einstellungsseiten gen&uuml;gend M&ouml;glichkeiten bieten, um mit allen erdenklichen Formaten zurechtzukommen, gibt es h&auml;ufig Situationen, in denen die Verarbeitung &uuml;ber VBA-Programmierung ben&ouml;tigt wird. Hier geht es in erster Linie um den Umgang mit Texten in unterschiedlicher Sprachkodierung.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662015,66032015,44000018],"tags":[],"class_list":["post-55000280","post","type-post","status-publish","format-standard","hentry","category-662015","category-66032015","category-Datenzugriff_programmieren"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kodierte Texte mit VBA umwandeln - Access [basics]<\/title>\n<meta name=\"description\" content=\"Auch wenn die Assistenten von Access zum Import und Export von Textdateien \u00fcber ihre Einstellungsseiten gen\u00fcgend M\u00f6glichkeiten bieten, um mit allen erdenklichen Formaten zurechtzukommen, gibt es h\u00e4ufig Situationen, in denen die Verarbeitung \u00fcber VBA-Programmierung ben\u00f6tigt wird. Hier geht es in erster Linie um den Umgang mit Texten in unterschiedlicher Sprachkodierung.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kodierte Texte mit VBA umwandeln - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Auch wenn die Assistenten von Access zum Import und Export von Textdateien \u00fcber ihre Einstellungsseiten gen\u00fcgend M\u00f6glichkeiten bieten, um mit allen erdenklichen Formaten zurechtzukommen, gibt es h\u00e4ufig Situationen, in denen die Verarbeitung \u00fcber VBA-Programmierung ben\u00f6tigt wird. Hier geht es in erster Linie um den Umgang mit Texten in unterschiedlicher Sprachkodierung.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/VBA_tblLCIDs.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"30\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/VBA_tblLCIDs.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html\",\"name\":\"Kodierte Texte mit VBA umwandeln - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:21+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Auch wenn die Assistenten von Access zum Import und Export von Textdateien \\u00fcber ihre Einstellungsseiten gen\\u00fcgend M\\u00f6glichkeiten bieten, um mit allen erdenklichen Formaten zurechtzukommen, gibt es h\\u00e4ufig Situationen, in denen die Verarbeitung \\u00fcber VBA-Programmierung ben\\u00f6tigt wird. Hier geht es in erster Linie um den Umgang mit Texten in unterschiedlicher Sprachkodierung.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Kodierte_Texte_mit_VBA_umwandeln.html\",\"name\":\"Kodierte Texte mit VBA umwandeln\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000280"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000280\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}