gpt4 book ai didi

java - 从 Java 中的字符串中过滤非 MySQL Latin1 字符

转载 作者:行者123 更新时间:2023-11-30 23:44:04 25 4
gpt4 key购买 nike

我有一个使用 latin1 的 MySQL 表,不幸的是我无法更改它。

在将字符串插入该表之前,我想检查字符串是否包含不属于 latin1 字符集的字符。这样我就可以将其从我的数据集中删除。

我该怎么做?

例如

boolean hasNonLatin1Chars = string.chars()
.anyMatch(c -> ...)

最佳答案

为了保持简单和健壮,利用 CharsetEncoder :

/** 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
}
}

这将用替换字符 rep(当然应该是有效的 Latin1 字符)替换 ISO_8859_1(= Latin1)中的每个无效字符集。

如果您接受默认替换 ('?'),您可以使其更简单:

public static String latin1(String str) {
return new String(str.getBytes(StandardCharsets.ISO_8859_1),
StandardCharsets.ISO_8859_1);
}

例如:

public static void main(String[] args)  {
String x = "hi Œmar!";
System.out.println("'" + x + "' -> '" + latin1(x,'?') + "'");
}

输出 'hi Œmar!' -> '嗨?mar!'

这种方法的一个可能缺点是只允许您用单个替换字符替换每个无效字符 - 您不能删除它或使用多字符序列。如果你想要这个,并且有理由确定某个字符永远不会出现在你的字符串中,你可以使用通常的肮脏技巧 - 例如,假设 \u0000 永远不会出现:

/* 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);
}

关于java - 从 Java 中的字符串中过滤非 MySQL Latin1 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52443595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com