用普通文本字体替换字符串
Replace String with font with Normal text font
您好,我在我的应用程序中使用 Firebase 数据库来仅存储我的用户的文本。我为我的用户提供了通过“Panam Palmer”等关键字研究文本的可能性。问题是当文本使用这样的字体书写时 '' 数据库无法找到包含该文本的 post。所以我的问题是如何用 'Panam Palmer' 普通文本替换 ' ' 字符串文本以将其存储在我的数据库中
如果实际上是一种字体,那么它应该按预期工作,例如 P 应该是 0x50。但是在十六进制编辑器里粘贴,可以看到你贴的是utf32。因此,您要么必须将数据库中的格式更改为与输入相同,要么必须将 utf32 解析为数据库中期望的任何输入格式,例如 utf8。这将通过开关或方法完成。
编辑:这是我如何转换它的示例。它转换这些字符的大小写。
static String utf32ToUtf8(String input)
{
byte[] arr = input.getBytes(StandardCharsets.UTF_16LE);
StringBuilder out = new StringBuilder();
for (int i = 0; i < arr.length; i += 2)
{
if (arr[i] == 53 && arr[i + 1] == -40)
{
i += 2;
if (i < arr.length)
{
if (arr[i] >= 60 && arr[i] <= 85)
out.append((char) (arr[i] + 5));
else if (arr[i] >= 86 && arr[i] <= 111)
out.append((char) (arr[i] + 11));
}
}
else
out.append((char)arr[i]);
}
return out.toString();
}
public static void main(String[] args)
{
String input = "\uD835\uDE4B\uD835\uDE56\uD835\uDE63\uD835\uDE56\uD835\uDE62 \uD835\uDE4B\uD835\uDE56\uD835\uDE61\uD835\uDE62\uD835\uDE5A\uD835\uDE67";
System.out.println(utf32ToUtf8(input));
}
或者,您可以使用导入 java.text.Normalizer
public static void main(String[] args)
{
String input = "\uD835\uDE4B\uD835\uDE56\uD835\uDE63\uD835\uDE56\uD835\uDE62 \uD835\uDE4B\uD835\uDE56\uD835\uDE61\uD835\uDE62\uD835\uDE5A\uD835\uDE67>\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n#cyberpunk #cyberpunk2077 \uD835\uDC07\uD835\uDC04\uD835\uDC08\uD835\uDC0B\uD835\uDC0D\uD835\uDC00\uD835\uDC0D";
String ns = Normalizer.normalize(input, Normalizer.Form.NFKC);
byte[] arr = ns.getBytes(StandardCharsets.UTF_16LE);
System.out.println(ns);
System.out.println(Arrays.toString(arr));
}
您好,我在我的应用程序中使用 Firebase 数据库来仅存储我的用户的文本。我为我的用户提供了通过“Panam Palmer”等关键字研究文本的可能性。问题是当文本使用这样的字体书写时 '' 数据库无法找到包含该文本的 post。所以我的问题是如何用 'Panam Palmer' 普通文本替换 ' ' 字符串文本以将其存储在我的数据库中
如果实际上是一种字体,那么它应该按预期工作,例如 P 应该是 0x50。但是在十六进制编辑器里粘贴,可以看到你贴的是utf32。因此,您要么必须将数据库中的格式更改为与输入相同,要么必须将 utf32 解析为数据库中期望的任何输入格式,例如 utf8。这将通过开关或方法完成。
编辑:这是我如何转换它的示例。它转换这些字符的大小写。
static String utf32ToUtf8(String input)
{
byte[] arr = input.getBytes(StandardCharsets.UTF_16LE);
StringBuilder out = new StringBuilder();
for (int i = 0; i < arr.length; i += 2)
{
if (arr[i] == 53 && arr[i + 1] == -40)
{
i += 2;
if (i < arr.length)
{
if (arr[i] >= 60 && arr[i] <= 85)
out.append((char) (arr[i] + 5));
else if (arr[i] >= 86 && arr[i] <= 111)
out.append((char) (arr[i] + 11));
}
}
else
out.append((char)arr[i]);
}
return out.toString();
}
public static void main(String[] args)
{
String input = "\uD835\uDE4B\uD835\uDE56\uD835\uDE63\uD835\uDE56\uD835\uDE62 \uD835\uDE4B\uD835\uDE56\uD835\uDE61\uD835\uDE62\uD835\uDE5A\uD835\uDE67";
System.out.println(utf32ToUtf8(input));
}
或者,您可以使用导入 java.text.Normalizer
public static void main(String[] args)
{
String input = "\uD835\uDE4B\uD835\uDE56\uD835\uDE63\uD835\uDE56\uD835\uDE62 \uD835\uDE4B\uD835\uDE56\uD835\uDE61\uD835\uDE62\uD835\uDE5A\uD835\uDE67>\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n#cyberpunk #cyberpunk2077 \uD835\uDC07\uD835\uDC04\uD835\uDC08\uD835\uDC0B\uD835\uDC0D\uD835\uDC00\uD835\uDC0D";
String ns = Normalizer.normalize(input, Normalizer.Form.NFKC);
byte[] arr = ns.getBytes(StandardCharsets.UTF_16LE);
System.out.println(ns);
System.out.println(Arrays.toString(arr));
}