/**replaces any invalid character in Latin1 by the character rep */
public static String latin1(String str, char rep) {
CharsetEncoder cs = StandardCharsets.ISO_8859_1.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE)
.replaceWith(new byte[] { (byte) rep });
try {
ByteBuffer b = cs.encode(CharBuffer.wrap(str));
return new String(b.array(), StandardCharsets.ISO_8859_1);
} catch (CharacterCodingException e) {
throw new RuntimeException(e); // should not happen
}
}
/* removes invalid Latin1 charaters - assumes the zero character never appears */
public static String latin1removeinvalid(String str) {
return latin1(str,(char)0).replace("\u0000", "");
}
补充:如果您只想检查有效性,那么更简单:
public static boolean isValidLatin1(String str) {
return StandardCharsets.ISO_8859_1.newEncoder().canEncode(str);
}
3条答案
按热度按时间a1o7rhls1#
要保持它的简单和健壮,请利用
CharsetEncoder
:这将用替换字符替换iso\U 8859\U 1(=latin1)中的每个无效字符集
rep
(当然,应该是一个有效的拉丁字符)。如果您同意默认替换(
'?'
),您可以简化:例如:
输出
'hi Œmar!' -> 'hi ?mar!'
这种方法的一个可能的缺点是只允许用一个替换字符替换每个无效字符—不能删除它或使用多字符序列。如果您想要这样做,并且有理由确信某些字符永远不会出现在您的字符串中,您可以使用常见的肮脏技巧—例如,假设\u0000
永远不会出现:补充:如果您只想检查有效性,那么更简单:
eivgtgni2#
拉丁语的基本范围是
0020–007F
,因此可以检查尝试替换非拉丁字符的第一个示例是否与原始字符匹配String
:这会回来的
false
如果它包含非拉丁字符。有拉丁语-1增补(
00A0 — 00FF
),拉丁文扩展-a(0100 — 017F
)拉丁语扩展-b(0180 — 024F
)因此,您可以根据需要修改范围。tcbh2hod3#
如果源数据始终是utf8,那么就这样说。然后你得到了最好的两个世界-utf8字符有一个音译拉丁1将被改变;不这样做的人会被称为“?”。
把这个用在
getConnection()
电话:没有坏字符测试,没有代码转换。mysql自动完成所有的工作。