【问题标题】:Specify utf-8 character encoding in RTF? The text (in UTF-8) format is correctly shown in Sqlite在 RTF 中指定 utf-8 字符编码?文本(UTF-8 格式)在 Sqlite 中正确显示
【发布时间】:2021-02-19 09:43:44
【问题描述】:

如何设置 UTF-8 字符编码格式的字符在 RTF 中的字符编码?

我研究了类似的问题,但没有找到好的解决方案。所以,我希望你能帮忙。

内容在 Sqlite 数据库中。 Slqite 数据库中的文本只能使用 UTF-8、UTF-16 或类似格式进行格式化。所以这就是我必须坚持使用 UTF-8 的原因。

使用 Sqlite 数据库浏览器可以正确显示 e"。

所需的目标程序,只能读取 RTF,显示字符的方式很奇怪。

我试过例如:

{\rtf1\ansi\ansicpg0\uc0...
{\rtf1\ansi\ansicpg1252\uc0...
{\rtf1\ansi\ansicpg65001\uc0...

一种选择是将特殊字符映射到它们的等效 RTF 字符,如this table 所示。

【问题讨论】:

    标签: utf-8 rtf


    【解决方案1】:

    你提到的网站链接到Unicode in RTF

    如果字符介于 255 和 32,768 之间,则表示为 \uc1\unumber*。例如,字符号 21,487 在 RTF 中为 \uc1\u21487*

    如果字符介于 32,768 和 65,535 之间,则从中减去 65,536,然后使用得到的负数。例如,是字符 36,947,所以我们减去 65,536 得到 -28,589,我们在 RTF 中有\uc1\u-28589*

    如果字符超过65,535,那么我们就不能用RTF来表达了

    看起来 RTF 根本不知道 UTF-8,一般只知道 Unicode。其他答案for JavaC# just 直接使用\u

    【讨论】:

    • 精彩的答案,点赞!
    【解决方案2】:

    我在很多地方读到 RTF 没有 UTF-8 标准解决方案。

    所以,我在扫描了一半的互联网后创建了自己的转换器。如果您有标准/更好的解决方案,请告诉我!

    所以在研究了this book 之后,我创建了一个基于these character mappings 的转换器。很棒的资源。

    这解决了我的问题。重复使用其他解决方案是我想为这种功能做的,但是我找不到一个,唉。

    转换器可能类似于:

    public static String convertHtmlToRtf(String html) {
        String tmp = html.replaceAll("\\R", " ")
                .replaceAll("\\\\", "\\\\\\\\")
                .replaceAll("\\{", "\\\\{")
                .replaceAll("}", "\\\\}");
        tmp = tmp.replaceAll("<a\\s+target=\"_blank\"\\s+href=[\"']([^\"']+?)[\"']\\s*>([^<]+?)</a>",
                "{\\\\field{\\\\*\\\\fldinst HYPERLINK \"$1\"}{\\\\fldrslt \\\\plain \\\\f2\\\\b\\\\fs20\\\\cf2 $2}}");
        tmp = tmp.replaceAll("<a\\s+href=[\"']([^\"']+?)[\"']\\s*>([^<]+?)</a>",
                "{\\\\field{\\\\*\\\\fldinst HYPERLINK \"$1\"}{\\\\fldrslt \\\\plain \\\\f2\\\\b\\\\fs20\\\\cf2 $2}}");
    
        tmp = tmp.replaceAll("<h3>", "\\\\line{\\\\b\\\\fs30{");
        tmp = tmp.replaceAll("</h3>", "}}\\\\line\\\\line ");
        tmp = tmp.replaceAll("<b>", "{\\\\b{");
        tmp = tmp.replaceAll("</b>", "}}");
        tmp = tmp.replaceAll("<strong>", "{\\\\b{");
        tmp = tmp.replaceAll("</strong>", "}}");
        tmp = tmp.replaceAll("<i>", "{\\\\i{");
        tmp = tmp.replaceAll("</i>", "}}");
        tmp = tmp.replaceAll("&amp;", "&");
        tmp = tmp.replaceAll("&quot;", "\"");
        tmp = tmp.replaceAll("&copy;", "{\\\\'a9}");
        tmp = tmp.replaceAll("&lt;", "<");
        tmp = tmp.replaceAll("&gt;", ">");
        tmp = tmp.replaceAll("<br/?><br/?>", "{\\\\pard \\\\par}\\\\line ");
        tmp = tmp.replaceAll("<br/?>", "\\\\line ");
        tmp = tmp.replaceAll("<BR>", "\\\\line ");
        tmp = tmp.replaceAll("<p[^>]*?>", "{\\\\pard ");
        tmp = tmp.replaceAll("</p>", " \\\\par}\\\\line ");
        tmp = convertSpecialCharsToRtfCodes(tmp);
        return "{\\rtf1\\ansi\\ansicpg0\\uc0\\deff0\\deflang0\\deflangfe0\\fs20{\\fonttbl{\\f0\\fnil Tahoma;}{\\f1\\fnil Tahoma;}{\\f2\\fnil\\fcharset0 Tahoma;}}{\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue0;}" + tmp + "}";
    }
    
     private static String convertSpecialCharsToRtfCodes(String input) {
        char[] chars = input.toCharArray();
        StringBuffer sb = new StringBuffer();
        int length = chars.length;
        for (int i = 0; i < length; i++) {
            switch (chars[i]) {
                case '’':
                    sb.append("{\\'92}");
                    break;
                case '`':
                    sb.append("{\\'60}");
                    break;
                case '€':
                    sb.append("{\\'80}");
                    break;
                case '…':
                    sb.append("{\\'85}");
                    break;
                case '‘':
                    sb.append("{\\'91}");
                    break;
                case '̕':
                    sb.append("{\\'92}");
                    break;
                case '“':
                    sb.append("{\\'93}");
                    break;
                case '”':
                    sb.append("{\\'94}");
                    break;
                case '•':
                    sb.append("{\\'95}");
                    break;
                case '–':
                case '‒':
                    sb.append("{\\'96}");
                    break;
                case '—':
                    sb.append("{\\'97}");
                    break;
                case '©':
                    sb.append("{\\'a9}");
                    break;
                case '«':
                    sb.append("{\\'ab}");
                    break;
                case '±':
                    sb.append("{\\'b1}");
                    break;
                case '„':
                    sb.append("\"");
                    break;
                case '´':
                    sb.append("{\\'b4}");
                    break;
                case '¸':
                    sb.append("{\\'b8}");
                    break;
                case '»':
                    sb.append("{\\'bb}");
                    break;
                case '½':
                    sb.append("{\\'bd}");
                    break;
                case 'Ä':
                    sb.append("{\\'c4}");
                    break;
                case 'È':
                    sb.append("{\\'c8}");
                    break;
                case 'É':
                    sb.append("{\\'c9}");
                    break;
                case 'Ë':
                    sb.append("{\\'cb}");
                    break;
                case 'Ï':
                    sb.append("{\\'cf}");
                    break;
                case 'Í':
                    sb.append("{\\'cd}");
                    break;
                case 'Ó':
                    sb.append("{\\'d3}");
                    break;
                case 'Ö':
                    sb.append("{\\'d6}");
                    break;
                case 'Ü':
                    sb.append("{\\'dc}");
                    break;
                case 'Ú':
                    sb.append("{\\'da}");
                    break;
                case 'ß':
                case 'β':
                    sb.append("{\\'df}");
                    break;
                case 'à':
                    sb.append("{\\'e0}");
                    break;
                case 'á':
                    sb.append("{\\'e1}");
                    break;
                case 'ä':
                    sb.append("{\\'e4}");
                    break;
                case 'è':
                    sb.append("{\\'e8}");
                    break;
                case 'é':
                    sb.append("{\\'e9}");
                    break;
                case 'ê':
                    sb.append("{\\'ea}");
                    break;
                case 'ë':
                    sb.append("{\\'eb}");
                    break;
                case 'ï':
                    sb.append("{\\'ef}");
                    break;
                case 'í':
                    sb.append("{\\'ed}");
                    break;
                case 'ò':
                    sb.append("{\\'f2}");
                    break;
                case 'ó':
                    sb.append("{\\'f3}");
                    break;
                case 'ö':
                    sb.append("{\\'f6}");
                    break;
                case 'ú':
                    sb.append("{\\'fa}");
                    break;
                case 'ü':
                    sb.append("{\\'fc}");
                    break;
                default:
                    if( chars[i] != ' ' && isSpaceChar( chars[i])) {
                        System.out.print( ".");
                        //sb.append("{\\~}");
                        sb.append(" ");
                    } else if( chars[i] == 8218) {
                        System.out.println("Strange comma ... ");
                        sb.append(",");
                    } else if( chars[i] > 132) {
                        System.err.println( "Special code that is not translated in RTF: '" + chars[i] + "', nummer=" + (int) chars[i]);
                        sb.append(chars[i]);
                    } else {
                        sb.append(chars[i]);
                    }
            }
        }
        return sb.toString();
    }
    

    【讨论】:

    • 我在任何链接站点中都没有看到 UTF-8,只有 Unicode。这已经在我的回答中了。
    • @AmigoJack - 是的,只有 Unicode。这就是我给+1的原因。为什么现在投反对票?
    • 因为您要求的是 UTF-8,而不是 Unicode。这个答案中的内容已经在我的答案中。您既没有为您的转换器发布代码,也没有您的问题概述您只对现有解决方案感兴趣。由于这些原因,这个答案没有价值,也不应该被接受。
    • 您的回答为我指明了方向,这就是我投赞成票的原因。有了答案,我必须找到如何前进,这对我来说并不清楚。我们同意不同意,没有问题。
    • 现在这对本问答的读者更有帮助。
    猜你喜欢
    • 2020-04-22
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多