Hmhh..
Noch mal für mein Verständnis:
Wenn ich diesem Parameter welchen mir Delphi beim Import als Widestring angelegt hat einen
"AnsiString" als Widestring mitgebe (also z.b. c:\MeineDatei.mov) kommt diese so an.
Wenn ich "MeineDatei" chinesisch mitgebe ( c:\我的档案.mov) kommt auf der anderen Seite c:\????.mov an.
Wenn ich das
ActiveX in VisualStudio in C++ importiere ist der Parameter LPCSTR. Dieser ist ja 8Bit.
Ich kann dann dort z.b. für den Dateinamen: c:\下周我要去度假.mov
dies übergeben:
Code:
char tmp[] = {'c', ':', '\\', 0xE4, 0xB8, 0x8B, 0xE5, 0x91, 0xA8, 0xE6, 0x88, 0x91, 0xE8, 0xA6, 0x81, 0xE5, 0x8E, 0xBB, 0xE5, 0xBA, 0xA6, 0xE5, 0x81, 0x87, '.', 'm', 'o', 'v', 0x00 }
Also müsste ich doch aus Delphi auch einen UTF8 codierten (
Ansi?-) String übergeben können?
Oder hat die
IDE einfach den Typen falsch genieriert?
Die Entwicklerin schreibt mir noch:
Das ActiveX arbeitet intern NUR mit LPCSTR oder array of char. Die Kodierung in UTF-8 macht es möglich mit chinesische oder russische Zeichen zu arbeiten.
Meine Meinung nach versucht den Wrapper 2 Byte Character in 1 Byte Character zu konvertieren und das geht schief wenn der Wert über 255 (oder 127?) liegt.
Daher kommen die ?. Wenn Sie die Dateiname in UTF-8 kodieren funktioniert (ab ActiveX 1.2.4.7 mit richtige Zeichen).
Falls Sie eine Rutine benötigen um die Konvertierung zu machen können Sie folgende benutzen:
Code:
/* utf8_setc:
* Sets a character in a UTF-8 string.
*/
int utf8_setc(char *s, int c)
{
int size, bits, b, i;
if (c < 128)
{
*s = c;
return 1;
}
bits = 7;
while (c >= (1<<bits))
bits++;
size = 2;
b = 11;
while (b < bits)
{
size++;
b += 5;
}
b -= (7-size);
s[0] = c>>b;
for (i=0; i<size; i++)
s[0] |= (0x80>>i);
for (i=1; i<size; i++)
{
b -= 6;
s[i] = 0x80 | ((c>>b)&0x3F);
}
return size;
}
int unicode_to_utf8n(wchar_t* src, char* dst, int srcLength, int maxOutLength)
{
int i = 0;
int utfsize = 0;
int unisize = 0;
for(i=0; i<srcLength; i++)
{
if (srcLength < (maxOutLength - 4))
utfsize += utf8_setc(dst+utfsize, (int)src[i]);
else
break;
}
dst[utfsize] = 0;
return utfsize;
}
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.