下面是一些代码来演示我的问题
#include <unicode/ucnv.h>
#include <stdio.h>
UConverter * converter;
void test_char(char inchar){
const char * inbuf=&inchar;
UErrorCode err=U_ZERO_ERROR;
UChar32 c = ucnv_getNextUChar(
converter,
&inbuf,
inbuf+1,
&err
);
printf("%x %s\n", c, u_errorName(err));
}
int main(){
UErrorCode err=U_ZERO_ERROR;
converter = ucnv_open("cp932", &err);
test_char(0x41); /*A*/
test_char(0xB1); /*ア*/
test_char(0xE1); /*Should be U_TRUNCATED_CHAR_FOUND*/
test_char(0xF1); /*Should be U_INVALID_CHAR_FOUND*/
return 0;
}
此代码打印
41 U_ZERO_ERROR
ff71 U_ZERO_ERROR
1a U_ZERO_ERROR
1a U_ZERO_ERROR
为什么无效的字符总是返回U_ZERO_ERROR,当有明显的错误?为什么它返回替换控件代码?替换不是一个有效的SHIFT-JIS字符吗?如何区分有效的替换和无效的SHIFT-JIS字符串?
1条答案
按热度按时间vulvrdjw1#
我在
ucnv.h
库的小字中找到了答案当转换器遇到非法、不规则、无效或不可Map的字符时,它的默认行为是使用替换字符来替换错误的字节序列。可以通过在转换器上使用uccode_setFromUCallBack()或uccode_setToUCallBack()来更改此行为。头文件ucnv_err.h定义了许多其他回调操作,可以用来代替字符替换。
因此,如果你想要实际的错误代码,你需要改变你的转换器回调。