【问题标题】:Replace String with font with Normal text font用普通文本字体替换字符串
【发布时间】:2020-12-30 03:46:10
【问题描述】:

您好,我在我的应用中使用 Firebase 数据库来仅存储我的用户的文本。我让我的用户可以通过“Panam Palmer”之类的关键字来研究文本。问题是当文本是用这样的字体写的'??????????????????? ????????????????????????数据库无法找到包含该文本的帖子。所以我的问题是如何替换 '??????????????????? ????????????????????????带有“Panam Palmer”普通文本的字符串文本以将其存储在我的数据库中

【问题讨论】:

    标签: java android string firebase fonts


    【解决方案1】:

    如果 ????? ?????? 实际上是一种字体,那么它应该按预期工作,例如 P 应该是 0x50。但是,通过在十六进制编辑器中粘贴 ????? ??????,您可以看到您发布的是 utf32。因此,您要么必须将数据库中的格式更改为与输入相同,要么必须将 utf32 解析为数据库中期望的任何输入格式,例如 utf8。这将通过 switch 或方法来完成。

    编辑:这是我如何转换它的示例。它为这些字符转换大小写。

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

    【讨论】:

    • 谢谢您的回答,您能给我一个十六进制的方法来更改“Panam Palmer”中的字符串“????? ?????”,谢谢您的帮助和您的时间
    • 好吧,先生,问题是您的函数正在从数据库中的字符串中删除所有文本。我在数据库中的字符串就像 '????? ??????>\n.\n.\n.\n.\n.\n.\n.\n.\n.\n.\n#cyberpunk #cyberpunk2077 #cyberpunk2077edit # cyberpunk2077cosplay #cyberpunk2077game #cyberpunkpanam' 我需要将所有内容保留在其中,只需更改 'Panam Palmer' 中的 '????? ??????',让我的用户可以查询我的数据库。我如何使用您的函数更改“Panam Palmer”中的“????? ??????”等文本并将其余字符串保留为。
    • 抱歉需要重新打开这个案例,因为你的函数不能使用像 '???????' 这样的字体,它应该给出结果 'heilnan' 但结果字符串是空的,我真的需要从每个可能的字体@Dark
    • 感谢您的耐心和您的工作时间,祝您有美好的一天
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多