为什么ICU的uccycle_getNextUChar没有设置错误代码?

vptzau2j  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(109)

下面是一些代码来演示我的问题

#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字符串?

vulvrdjw

vulvrdjw1#

我在ucnv.h库的小字中找到了答案
当转换器遇到非法、不规则、无效或不可Map的字符时,它的默认行为是使用替换字符来替换错误的字节序列。可以通过在转换器上使用uccode_setFromUCallBack()或uccode_setToUCallBack()来更改此行为。头文件ucnv_err.h定义了许多其他回调操作,可以用来代替字符替换。
因此,如果你想要实际的错误代码,你需要改变你的转换器回调。

ucnv_setToUCallBack(
    converter,
    UCNV_TO_U_CALLBACK_STOP,
    NULL,
    NULL,
    NULL,
    &err
);

相关问题