从Java中的本地SQLite数据库读取emojis

从Java中的本地SQLite数据库读取emojis,java,sql,emoji,Java,Sql,Emoji,我正在构建一个示例应用程序,它将会话从iOS sms数据库文件转换为可读的html页面 但在控制台和html页面中,emojis显示为“?”,但在DB浏览器中,它们显示正常 HTML预览示例: 我的代码是: public static void main(String[] args) throws SQLException, IOException { String url = "jdbc:sqlite:C:/test/sms2.db"; Connection conn

我正在构建一个示例应用程序,它将会话从iOS sms数据库文件转换为可读的html页面

但在控制台和html页面中,emojis显示为“?”,但在DB浏览器中,它们显示正常

HTML预览示例:

我的代码是:

public static void main(String[] args) throws SQLException, IOException {

     String url = "jdbc:sqlite:C:/test/sms2.db";

     Connection conn = DriverManager.getConnection(url);

     Statement s = conn.createStatement();

     ResultSet rs = s.executeQuery("SELECT handle_id,is_from_me,text FROM message");

     File f = new File("C:\\Users\\theda\\Documents\\Messages\\convo\\+1**********.html");
     if(!f.exists())
         f.createNewFile();
     FileWriter w = new FileWriter(f);
     WriterOutputStream write = new WriterOutputStream(w, Charset.forName("utf8"));

     w.append("<link rel='stylesheet' type='text/css' href='message.css'>");
     w.append("<body>");

     while(rs.next()){
         if(rs.getInt("handle_id") == 3){
             String st = " ";
             String fromMe = " ";
             if(rs.getInt("is_from_me") == 1)
                 fromMe = "true";
             else
                 fromMe = "false";
             st = "<div class='message' data-outgoing='" + fromMe + "'>" + rs.getString("text") + "</div><br>";

             System.out.println(st);
             w.append(st);
         }
    }

     w.append("</body>");
     w.close();

}

确保您的HTML页面在元标记中使用了正确的字符集:

<meta charset="utf-8" />

一般来说,在将特殊字符放入HTML时,将其编码为HTML实体也是一个好主意。根据,您可以使用Java的StringEscapeUtils.escapeHtml方法来实现这一点。

谢谢您的回答,但现在它们显示为� 在html上,但他们确实会说“&55356;”和控制台中的类似,我建议您通过运行页面输出。它可能会识别页面上的一些编码问题。