2012-04-11 7 views
0

Ich verwende OSTranslate, um meine Mail-Body-Inhalt in Unicode-String zu konvertieren. Die für char arbeitet gut * weniger als Wortgrße 65535.OS_TRANSLATE_LMBCS_TO_UNICODE Problem

WORD Length = MAXWORD; 
actualOutLength = OSTranslate(OS_TRANSLATE_LMBCS_TO_UNICODE, (char*)inPtr, 
Length, (char*)outPtr, Length); 

Nach der Konvertierung enthält das Ausgabe-Array nur einen Teil einer Quellzeichenfolge.

Bitte schlagen Sie vor, was die richtige Vorgehensweise ist, um die Größe festzulegen, da meine Eingabestringgröße die MAXWORD-Größenbeschränkung überschreitet.

Antwort

0

Eine Möglichkeit, die ich habe, ist, dass wenn (MAXWORD-actualOutLength < 4) dann den Ausgabepuffer und führen Sie die umgekehrte Übersetzung mit OS_TRANSLATE_UNICODE_TO_LMBCS. Sie werden dieses Ergebnis wegwerfen - aber die zurückgegebene Länge ist die Länge des Teils des ursprünglichen Eingabepuffers, der verarbeitet wurde. Sie können also diese Länge verwenden, um Ihre inPtr weiterzuleiten, OSTranslate erneut mit OS_TRANSLATE_LMBCS_TO_UNICODE erneut aufzurufen und den erweiterten Ausgabepuffer in einer Schleife aufzubauen, bis Sie den Eingabepuffer erschöpft haben. Beachten Sie, dass dies nur funktioniert, wenn Ihre Eingabezeichenfolge LMBCS für Gruppe 1 optimiert ist. Wenn sie für eine andere Gruppe optimiert wurde, wird die Länge der umgekehrten Übersetzung wahrscheinlich nicht mit den Zeichen in Ihrem Eingabepuffer übereinstimmen.

Eine andere Möglichkeit wäre, NLS_get in einer Schleife zu verwenden, um Zeichen im Eingabepuffer bis MAXWORD/2 auszuzählen. Sie können dann entweder NLS_translate oder OSTtranslate für den ersten Teil des Eingabepuffers verwenden und sicherstellen, dass die Ausgabe in MAXWORD passt. Starten Sie dann erneut mit dem letzten Zeiger, den Sie von NLS_get erhalten haben, und fahren Sie in einer Schleife fort, bis Sie den gesamten Eingabepuffer durchlaufen haben.

+0

Hey danke für die Lösung! Ich habe die zweite Lösung implementiert, indem ich Daten in MAXWORD/2 gelesen habe, aber einen Szenerio der Randbedingung in Betracht gezogen habe, wo ein chinesisches Zeichen 3 Bytes besetzt, von denen das erste Byte im ersten Block und die nächsten zwei Bytes im nächsten Block erscheinen das betrifft die Lösung? –

+0

Ja, ich verstehe die Grenzbedingung, über die Sie sprechen. Deshalb habe ich vorgeschlagen, die Funktion NLS_get() zu verwenden, um die Zeichen zu scannen und zu zählen. Die NLS-Funktionen im Notes C API-Toolkit sind so aufgebaut, dass sie LMBCS-Zeichen korrekt verarbeiten. –

+0

Ich habe einige Dinge durcheinander gebracht, ich werde wirklich apprecaite, wenn Sie mir einen Beispielcode zum Lesen von Daten mit NLS_get-Funktion geben können. –