当我执行下面的代码时,为什么我会在第一个案例中获得'?'
? 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中的执行结果:
答案 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,则仅此一项可能会解决您的问题。