Недавно я оказался в следующей ситуации. Мне поручено написать dotNet-оболочку над native-библиотекой, некоторые (очень важные)функции которой имеют заголовок вида:
const char* XXX_get_error_message (XXX_connection connection);
При этом функции могут возвращать C-строки в разных кодировках, в том числе и в Юникоде. Кодировка в любой момент времени мне известна (доступен объект
System.Text.Encoding
), я даже сначала написал:
// MC++
const char* ptr = XXX_get_error_message (myConnection);
// Подсчет количества байт в строке.
int length = 0;
while (ptr[length]) length++;
unsigned char bytes __gc[] = new unsigned char __gc [length];
Marshal::Copy (const_cast<char*>(ptr), bytes, 0, length);
String* msg = myEncoding->GetString (bytes);
но ведь в некоторых кодировках могут содержаться нулевые байты, а значит подсчет байт до первого нулевого не подходит.

Подскажите, пожалуйста, как мне выкрутиться из этой ситуации? Может быть есть другой способ?
вообще-то есть стандартный конструктор
unsafe public String(
char* value
);
чем он вас не устраивает?
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, NETiZen, Вы писали:
NET>вообще-то есть стандартный конструктор
NET>unsafe public String(
NET> char* value
NET>);
NET>чем он вас не устраивает?
Дело в том, что он принимает только Unicode
а этот?
public: String(char*, int, int, Encoding*);
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, NETiZen, Вы писали:
NET>а этот?
NET>public: String(char*, int, int, Encoding*);
он, конечно, хорош. Но опять же требует количество байт в строке!
Здравствуйте, a.v.murashov, Вы писали:
AVM>Здравствуйте, NETiZen, Вы писали:
NET>>а этот?
NET>>public: String(char*, int, int, Encoding*);
AVM>он, конечно, хорош. Но опять же требует количество байт в строке!
извините, а померить длину нативной UNICODE строки уже не представляется возможным?