在RTF中指定utf-8字符编码?文本(UTF-8)格式在Sqlite中正确显示
如何设置UTF-8字符编码格式的字符的RTF字符编码 我研究了类似的问题,但没有找到一个好的解决方案。所以,我希望你能帮忙 内容位于Sqlite数据库中。Slqite数据库中的文本只能使用UTF-8、UTF-16或类似格式进行格式化。这就是为什么我必须坚持UTF-8 使用Sqlite数据库浏览器可以正确显示“e” 所需的目标程序只能读取RTF,以奇怪的方式显示字符 例如,我试过:在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...
{\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("&", "&");
tmp = tmp.replaceAll(""", "\"");
tmp = tmp.replaceAll("©", "{\\\\'a9}");
tmp = tmp.replaceAll("<", "<");
tmp = tmp.replaceAll(">", ">");
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因为这些原因,这个答案没有价值,也不应该被接受。你的答案给了我一个方向,这就是为什么我投了赞成票。对于这个答案,我必须找到前进的方向,这对我来说并不清楚。我们同意不同意,没有问题。现在这对本问答的读者更有帮助。