Unicode 是否保证mbcs编码中的尾随字节在特定范围内?

Unicode 是否保证mbcs编码中的尾随字节在特定范围内?,unicode,mbcs,Unicode,Mbcs,我需要读取包含任意MBCS编码字符串的文本文件。文件格式(简化)如下所示: CODEPAGE "STRING" CODEPAGE STRING ... 其中,代码页可以是任何MBCS代码页:UTF-8、cp1251(西里尔文)、cp932(日文)等 我无法在一次调用MultiByteToWideChar中解码整个文件。我需要在引号之间提取字符串,或者直到空格或回车符返回,并在提取的字符串上调用MultiByteToWideChar 但在MBCS(多字节编码方案)中,一个字符可以用多个字节表示。

我需要读取包含任意MBCS编码字符串的文本文件。文件格式(简化)如下所示:

CODEPAGE "STRING"
CODEPAGE STRING
...
其中,代码页可以是任何MBCS代码页:UTF-8、cp1251(西里尔文)、cp932(日文)等

我无法在一次调用MultiByteToWideChar中解码整个文件。我需要在引号之间提取字符串,或者直到空格或回车符返回,并在提取的字符串上调用MultiByteToWideChar

但在MBCS(多字节编码方案)中,一个字符可以用多个字节表示。若我想在多字节编码的文件中找到拉丁语“A”,我不能只搜索代码65,因为在某些编码序列中,65可以是尾随字节


所以我不确定是否允许我在MBCS字符串中搜索''或空格或CR就我所见,所有尾随字节都从0x40开始,所以扫描文件中的标点符号是安全的。但对于任何代码页,是否有某种保证?

分析编码的八位字节序列中可能出现的八位字节,丢弃前导字节。结果是0x40..0x7E,0x80..0xFE

#!/usr/bin/env perl
use Encode qw(encode);
my @encodings = qw(
    cp1006 cp1026 cp1047 cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256
    cp1257 cp1258 cp37 cp424 cp437 cp500 cp737 cp775 cp850 cp852 cp855 cp856
    cp857 cp858 cp860 cp861 cp862 cp863 cp864 cp865 cp866 cp869 cp874 cp875
    cp932 cp936 cp949 cp950
);
my %continuation_octets;
for my $e (@encodings) {
    for my $c (0..0x10_ffff) {
        my $encoded = encode $e, chr($c), sub { -1 };
        if ($encoded ne -1 && length($encoded) > 1) {
            my @octets = split //, $encoded;
            shift @octets;
            $continuation_octets{$_}++ for @octets;
        }
    }
}

谢谢!但不幸的是,这并不能回答我的问题。我想要的是扫描八位字节序列中的空格、引号或CR,并确保我不会遇到这些字符作为编码符号的一部分。我肯定知道我不能对“A”字符这样做,因为代码65可以是其他字符的一部分。但我不确定这是否适用于puN字符。我还可以忽略所有不能直接将asciii-7字符映射到自身的代码页。对于非unicode程序,我只受可以在Windows中设置为默认代码页的代码页的限制。谢谢你的脚本!超级!谢谢你!我肯定应该记得Perl:-)好消息是可以在y列出了cr、空格或引号的代码页。虽然遗憾的是“\”不安全:%continuation\u八位字节=(“\@”=>307,[“\ \”=>308,“\ \”=>305,]“=>309,”^“=>302,“`=>307,“{”=>308,}”=>306,~“=>304,“\200=>177。。。。