在RTF中指定utf-8字符编码?文本(UTF-8)格式在Sqlite中正确显示

在RTF中指定utf-8字符编码?文本(UTF-8)格式在Sqlite中正确显示,utf-8,rtf,Utf 8,Rtf,如何设置UTF-8字符编码格式的字符的RTF字符编码 我研究了类似的问题,但没有找到一个好的解决方案。所以,我希望你能帮忙 内容位于Sqlite数据库中。Slqite数据库中的文本只能使用UTF-8、UTF-16或类似格式进行格式化。这就是为什么我必须坚持UTF-8 使用Sqlite数据库浏览器可以正确显示“e” 所需的目标程序只能读取RTF,以奇怪的方式显示字符 例如,我试过: {\rtf1\ansi\ansicpg0\uc0... {\rtf1\ansi\ansicpg1252\uc0...

如何设置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字符等价物,如所示。

您提到的站点链接:

如果字符介于255和32768之间,请将其表示为
\uc1\unumber*
。例如,字符号21487在RTF中为
\uc1\u21487*

如果字符介于32768和65535之间,则从中减去65536,然后使用得到的负数。例如,是字符36947,因此我们减去65536得到-28589,在RTF中有
\uc1\u-28589*

如果字符超过65535,则无法用RTF表示


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

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

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

所以在学习之后,我创建了一个基于。大量资源的转换器

这就解决了我的问题。我想为这类功能重新使用其他解决方案,但我找不到,唉

转换器可能类似于:

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();
}
公共静态字符串转换器HTMLTORTF(字符串html){
字符串tmp=html.replaceAll(“\\R”,”)
.replaceAll(“\\\”,“\\\\”)
.replaceAll(“\\{”,“\\{”)
.replaceAll(“}”,“\\\}”);

tmp=tmp.replaceAll(“([^我在任何链接的网站上都没有看到UTF-8,只有Unicode。这已经在我的答案中了。@AmigoJack-是的,只有Unicode。这就是为什么我给出+1。为什么现在要向下投票?因为你要求的是UTF-8,而不是Unicode。这个答案中的内容已经在我的答案中了。你既没有发布转换器的代码,也没有列出你只有int因为这些原因,这个答案没有价值,也不应该被接受。你的答案给了我一个方向,这就是为什么我投了赞成票。对于这个答案,我必须找到前进的方向,这对我来说并不清楚。我们同意不同意,没有问题。现在这对本问答的读者更有帮助。