我需要测试包含valid non-ascii characters + invalid non-ascii characters + invalid ascii characters
的字符串的处理。
有人可以给我几个这样的角色的例子。如果你能让我知道他们在类别中的价值范围会很好,因为我无法区分哪些非ascii值有效以及哪些无效。
Ex : String str = "Bj��rk����oacute�";
^
Is it a valid or invalid non-ascii
仅供参考我是Java的初学者。
答案 0 :(得分:1)
一些背景
随着Java的发明,一个非常重要的设计决策是java中的文本将是Unicode:世界上所有字形的编号系统。因此char
是两个字节(UTF-16,Unicode和#34;通用字符集转换格式之一")。 byte
是二进制数据的不同类型。
Unicode将所有符号(所谓的代码点)(如♫
)编号为U + 266B。那些数字达到三字节整数。因此,java中的代码点表示为int
。
ASCII 是Unicode UTF-8的7位子集,0 - 127。
UTF-8 是一种多字节Unicode格式,其中ASCII是有效子集,更高的符号
<强> 有效期 强>
您被要求识别&#34;无效&#34;字符 =错误生成的代码点。 您还可以识别产生无效字符的代码部分。 (更容易。)
在上面�
中,占位符字符(如?
)替换了当前字符集中无法表示的代码点。如果代码产生?
作为占位符,则无法猜测是否发生了替换。对于一些西欧语言,编码是Windows-1252(Cp1252,MS Windows Latin-1)。您可以检查String中的代码点是否可以转换为Charset
。
然后保留假阳性,但在Cp1252中存在错误的字符。这可能是UTF-8的多字节代码序列,被解释为几个Window-1252字符。所以:与不可接受的非ASCII字符相邻的可接受的非ASCII字符也是可疑的。这意味着您需要列出您的语言中的特殊字符和附加内容:如特殊引号,英语借用ç
,ñ
。
对于MS-Windows Latin-1(改变的ISO Latin-1),例如:
boolean isSuspect(char ch) {
if (ch < 32) {
return "\f\n\r\t".indexOf(ch) != -1;
} else if (ch >= 127) {
return false;
} else {
return suspects.get((int) ch); // Better use a positive list.
}
}
static BitSet suspects = new BitSet(256);
static {
...
}
答案 1 :(得分:0)
有128个有效的基本ASCII字符,映射到值0(NUL
字节)到127(DEL
字符)。 See here
必须明智地使用“人物”这个词。 “人物”的定义是一个特殊的定义。例如,è
是一个字符吗?或者它是两个字符(e
和`
)?这取决于。
其次,字符序列完全独立于其编码。为简单起见,我假设每个字节都被解释为一个字符。
您可以确定是否可以将字节解析为ASCII字符,您只需执行以下操作:
byte[] bytes = "Bj��rk����oacute�".getBytes();
for (byte b : bytes) {
// What's happening here? A byte that is in the range from 0 to 127 is
// valid, and other values are invalid. A byte in Java is signed, that
// means that valid ranges are from -128 to 127.
if (b >= 0) {
System.out.println("Valid ASCII");
}
else {
System.out.println("Invalid ASCII");
}
}