WideCharToMultiByte如何处理代码页?

时间:2018-02-02 20:00:39

标签: unicode encoding character-encoding

当我执行下面的代码时,为什么我会在第一个案例中获得'?'? 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中的执行结果:

image

1 个答案:

答案 0 :(得分:1)

Windows代码页932并不简单 - 因为它使用多字节字符。

我这里没有Windows,所以我一直在尝试使用你在Python3中使用的字符的编码,在UTF-8终端中:它适用于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中存在char,则仅此一项可能会解决您的问题。