Einzelnen Beitrag anzeigen

taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: UTF8 als WideString an ActiveX (LPCTSTR)

  Alt 22. Mai 2012, 12:17
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.
  Mit Zitat antworten Zitat