WideCharToMultiByte кога е вярно lpUsedDefaultChar?

Опитвам се да разбера WideCharToMultiByte и се чудех кога lpUsedDefaultChar ще бъде зададено на TRUE.

Ето пример: Какво трябва да бъде lpszW, за да може флагът да бъде зададен като верен?

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 вероятно е най-често срещаната кодова страница и повечето от тези знаци съпоставяне на същата стойност в unicode.

Вземете например Ω (ohm), вероятно е не присъства в каквато и да е текущата ви кодова страница и следователно няма да се съпостави с валиден тесен знак:

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
Благодаря Anders, трябваше да формулирам този въпрос по-добре. Ако предам низ Labc\x0100, пак получавам fUsedDefaultChar == true. Какъв е точният диапазон? - person tvr; 18.01.2011
comment
@tvr: Няма точен диапазон, тъй като зависи от кодовата страница, към която конвертирате, но всичко ‹= ​​127 трябва да е безопасно. - person Anders; 18.01.2011

В документацията на MSDN е много ясно кога lpUsedDefaultChar е зададено на TRUE:

lpDefaultChar [in] По избор. Указател към знака, който да се използва, ако даден знак не може да бъде представен в указаната кодова страница. Приложението задава този параметър на NULL, ако функцията трябва да използва системна стойност по подразбиране. За да получи системния знак по подразбиране, приложението може да извика функцията GetCPInfo или GetCPInfoEx.

lpUsedDefaultChar [out] По избор. Указател към флаг, който показва дали функцията е използвала знак по подразбиране при преобразуването. Флагът е зададен на TRUE, ако един или повече символи в изходния низ не могат да бъдат представени в указаната кодова страница. В противен случай флагът е зададен на FALSE. Този параметър може да бъде зададен на NULL.

Това според мен не оставя много място за недоразумения.

person Remy Lebeau    schedule 18.01.2011