【问题标题】:WideCharToMultiByte when is lpUsedDefaultChar true?WideCharToMultiByte lpUsedDefaultChar 何时为真?
【发布时间】:2011-06-10 20:08:50
【问题描述】:

我正在尝试理解 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 内容的书籍/教程都会很棒。

谢谢!

【问题讨论】:

    标签: windows winapi unicode mfc


    【解决方案1】:

    当前代码页中不存在的任何内容都将映射到 ? (默认情况下)并且 UsedDefaultChar 将为 != FALSE。

    Windows-1252 可能是最常见的代码页,其中大部分字符 map to the same value 在 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
    

    【讨论】:

    • 谢谢安德斯,我应该更好地提出这个问题。如果我传入一个字符串 L"abc\x0100" 我仍然得到 fUsedDefaultChar == true。确切的范围是多少?
    • @tvr:没有确切的范围,因为它取决于您要转换到的代码页,但任何
    【解决方案2】:

    MSDN documentation 非常清楚 lpUsedDefaultChar 何时设置为 TRUE:

    lpDefaultChar [in] 可选。指针 到要使用的字符 if 字符 不能在指定中表示 代码页。应用程序设置了这个 如果函数为 NULL,则参数为 使用系统默认值。到 获取系统默认字符, 应用程序可以调用 GetCPInfo 或 GetCPInfoEx 函数。

    lpUsedDefaultChar [out] 可选。 指向一个标志的指针,该标志指示是否 该函数使用了默认值 转换中的字符。国旗 如果有一个或多个,则设置为 TRUE 源字符串中的字符不能 以指定的代码表示 页。否则,标志设置为 错误的。该参数可以设置为 空。

    在我看来,这并没有留下太多误解的余地。

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 2011-08-03
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2013-05-03
      • 2011-08-25
      相关资源
      最近更新 更多