WideCharToMultiByte, когда значение lpUsedDefaultChar истинно?

Я пытаюсь понять WideCharToMultiByte, и мне было интересно, когда для lpUsedDefaultChar будет установлено значение TRUE.

Вот пример: Каким должен быть lpszW, чтобы флаг был установлен в true?

lpszW = L”__WHAT SHOULD_BE_HERE__”;
int c = ??;
BOOL fUsedDefaultChar = false;
DWORD dwSize = WideCharToMultiByte(CP_ACP, 0, lpszW,  c, myOutStr ,myOutLen, NULL, &fUsedDefaultChar); 

http://msdn.microsoft.com/en-us/library/dd374130(VS.85).aspx

Любые книги/учебники для понимания Unicode/UTF были бы замечательными.

Спасибо!


person tvr    schedule 18.01.2011    source источник


Ответы (2)


Все, чего нет в текущей кодовой странице, будет отображено на ? (по умолчанию) и UsedDefaultChar будет != FALSE.

Windows-1252, вероятно, является наиболее распространенной кодовой страницей, и большинство из этих символов сопоставляется с тем же значением в Юникоде.

Возьмем, например, Ω (Ом). не присутствует в вашей текущей кодовой странице и, следовательно, не будет отображаться на допустимый узкий символ:

BOOL fUsedDefaultChar=FALSE;
DWORD dwSize;
char myOutStr[MAX_PATH];
WCHAR lpszW[10]=L"Hello";
*lpszW=0x2126; //ohm sign, you could also use the \u2126 syntax if your compiler supports it.
dwSize = WideCharToMultiByte(CP_ACP, 0, lpszW,  -1, myOutStr ,MAX_PATH, NULL, &fUsedDefaultChar); 
printf("%d %s\n",fUsedDefaultChar,myOutStr); //This prints "1 ?ello" on my system
person Anders    schedule 18.01.2011
comment
Спасибо Андерс, я должен был лучше сформулировать этот вопрос. Если я передам строку Labc\x0100, я все равно получу fUsedDefaultChar == true. Каков точный диапазон? - person tvr; 18.01.2011
comment
@tvr: точного диапазона нет, поскольку он зависит от кодовой страницы, в которую вы конвертируете, но все ‹= 127 должно быть безопасным. - person Anders; 18.01.2011

В документации MSDN очень четко указано, когда lpUsedDefaultChar установлено значение ИСТИНА:

lpDefaultChar [in] Необязательный. Указатель на символ, используемый, если символ не может быть представлен в указанной кодовой странице. Приложение устанавливает для этого параметра значение NULL, если функция должна использовать системное значение по умолчанию. Чтобы получить системный символ по умолчанию, приложение может вызвать функцию GetCPInfo или GetCPInfoEx.

lpUsedDefaultChar [выходной] Необязательный. Указатель на флаг, указывающий, использовала ли функция при преобразовании символ по умолчанию. Флаг устанавливается в значение TRUE, если один или несколько символов в исходной строке не могут быть представлены в указанной кодовой странице. В противном случае флаг устанавливается в FALSE. Этот параметр может быть установлен в NULL.

Это, на мой взгляд, не оставляет места для недоразумений.

person Remy Lebeau    schedule 18.01.2011