用普通文本字体替换字符串

6ss1mwsb  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(467)

嗨,我在我的应用程序中使用firebase数据库只存储我的用户的文本。我给我的用户的可能性,研究文本的关键字,如“帕南帕尔默”。问题是当文本是用这样的字体写的时候数据库找不到包含文本的帖子。所以我的问题是,我怎么才能取代'????????'字符串文本与'帕纳姆帕尔默'普通文本存储在我的数据库

a11xaf1n

a11xaf1n1#

如果??????实际上是一种字体,那么它应该像预期的那样工作,例如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));
}

或者,可以使用import 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));
}

相关问题