【问题标题】:How does WideCharToMultiByte deal with codepages?WideCharToMultiByte 如何处理代码页?
【发布时间】:2018-02-02 20:00:39
【问题描述】:

当我执行下面的代码时,为什么我在第一种情况下得到'?'? AFAIK,代码页 932 支持线条绘制字符。

此 API 如何处理代码页? AFAIK,它在代码页中搜索并映射字符,然后从代码页返回字符的位置。

typedef struct dbcs {
    unsigned char HighByte;
    unsigned char LowByte;
} DBCS;

static DBCS set[5] = {0x25,0x5D};
unsigned char array[2];

#include <windows.h>
#include <stdio.h>

int main()
{
    // printf("hello world");
    int str_size;
    LPCWSTR                 charpntr;
    LPSTR                   getcd;
    LPBOOL                  flg;
    int i ;

    array[0] = set[0].LowByte;
    array[1] = set[0].HighByte;
    charpntr = &array;
    str_size = WideCharToMultiByte(932, 0, charpntr, 1, getcd, 2, NULL, NULL);
    printf(" value of %u", getcd);
    printf("number of bytes %d character is  %s", str_size, getcd);
    printf("\n");

    array[0] = set[0].LowByte;
    array[1] = set[0].HighByte;
    charpntr = &array;
    str_size = WideCharToMultiByte(437, 0, charpntr, 1, getcd, 2, NULL, NULL);
    printf(" value of %u", getcd);
    printf("number of bytes %d character is  %s", str_size, getcd);
    printf("\n");
}

CodeBlocks 中的执行结果:

【问题讨论】:

    标签: unicode encoding character-encoding


    【解决方案1】:

    Windows 代码页 932 不是一件简单的事情 - 因为它使用多字节字符。

    我这里没有 Windows,所以我一直在尝试在 UTF-8 终端中对您在 Python3 中使用的字符进行编码:它适用于 cp437 和 UTF-8,但 Python 拒绝对字符进行编码到它所谓的“cp932”或维基百科文章中列出的任何别名:

    https://en.wikipedia.org/wiki/Code_page_932_(Microsoft_Windows)

    这可能是 Python 内部 Unicode 表(直接从 Unicode 联盟获取)中的一个错误,或者此代码页根本没有映射此字符。

    不管怎样,你的代码有问题:一个是你从来没有初始化getcd。阅读 WideCharToMultiByte() 的文档,发现它不应该设置为 NULL,因此您必须在那里分配适当的返回缓冲区。

    所以,尝试将getcd 声明为:

    char getcd[6]={};

    这应该给你足够的空间来容纳你试验的最宽的字符,并包括一个字符串\x00 终止符。

    另一件事是,如果这些画线字符存在于 CP932 中,它们肯定是多字节的 - 因此调用的 cbMultiByte 参数(charptr 之后的“1”)应至少设置为 2。如果没有其他错误出现,并且 cp932 中存在字符,则仅此一项就可以解决您的问题。

    【讨论】:

    • 不应该是LPSTR getcd[],应该是char getcd[]。一个空的初始化器将填零,所以最简单的是char getcd[6]={}
    猜你喜欢
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多