【问题标题】:DataInputStream and UTF-8数据输入流和 UTF-8
【发布时间】:2011-05-29 03:36:39
【问题描述】:

我是一个新程序员,我正在处理的代码有几个问题。

代码所做的基本上是从另一个 JSP 接收表单,读取字节,解析数据,然后使用 DataInputStream 将结果提交给 SalesForce。

   //Getting the parameters from request
 String contentType = request.getContentType();
 DataInputStream in = new DataInputStream(request.getInputStream());
 int formDataLength = request.getContentLength();

 //System.out.println(formDataLength);
 byte dataBytes[] = new byte[formDataLength];
 int byteRead = 0;
 int totalBytesRead = 0;
 while (totalBytesRead < formDataLength) 
 {
  byteRead = in.read(dataBytes, totalBytesRead, formDataLength);
  totalBytesRead += byteRead;
 }

它工作正常,但前提是代码处理普通字符。每当它尝试处理特殊字符(如法语字符:àâäæçéèêëîïôùûü)时,我都会得到以下乱码:

âäæçéèêëîïôùûü

我知道这可能是 DataInputStream 的问题,以及它如何不返回 UTF-8 编码的文本。你们对如何解决这个问题有什么建议吗?

所有 .jsp 文件都包含 并且 Tomcat 的设置很好(URI = UTF-8 等)。我尝试添加:

request.setCharacterEncoding("UTF-8");

response.setCharacterEncoding("UTF-8");

无济于事。

以下是它如何解析数据的示例:

    //Getting the notes for the Case 
 String notes = new String(dataBytes);
 System.out.println(notes);
 String savenotes = casetype.substring(notes.indexOf("notes"));
 //savenotes = savenotes.substring(savenotes.indexOf("\n"), savenotes.indexOf("---"));
 savenotes = savenotes.substring(savenotes.indexOf("\n")+1);
 savenotes = savenotes.substring(savenotes.indexOf("\n")+1);
 savenotes = savenotes.substring(0,savenotes.indexOf("name=\"datafile"));
 savenotes = savenotes.substring(0,savenotes.lastIndexOf("\n------"));
 savenotes = savenotes.trim();

提前致谢。

【问题讨论】:

    标签: java utf-8 character-encoding datainputstream


    【解决方案1】:

    问题不在于输入流,因为它们不处理字符,而只处理字节。您的问题在于您将这些字节转换为字符。在这种特殊情况下,您需要在String constructor 中指定正确的编码。

    String notes = new String(dataBytes, "UTF-8");
    

    另见:


    顺便说一句,DataInputStream 在特定代码 sn-p 中没有附加值。你可以保留它InputStream

    【讨论】:

    • 感谢您的快速响应,先生。实际上,我在这里发布之前尝试过(由于几年前发现的一篇文章)并着手实施该解决方案。如果我使用该方法并打印出注释,字符将显示,尽管由于 consolechar 限制而无法正确显示,我知道的 UTF-8 等价物是 àâäæçéèêëîïïôùûü。但是,一旦它解析了信息,并且我打印出了保存笔记,它将显示 à âäæçéèêëîïôùûü (同样,不是那些由于控制台的字符char 限制,但等效)。
    • 使用 IDE(首先在控制台中将其配置为使用 UTF-8),或写入文件(使用 OutputStreamWriter"UTF-8")然后在文本编辑器中打开,或将其显示为 Swing JPanel 左右。命令控制台无法显示超出 ASCII 范围的 UTF-8 字符。
    • 嗯,是的,我完全理解。无论如何,使用 new String(dataBytes, "UTF-8") 并不能解决问题。我仍然以 à âäæçéèêëîïôùûü 作为我的注释文本。
    • 好吧,这并不能进一步帮助您。至少,当这些字节被转换(编码)为字符时,问题显然就在那个时候。这一点是错误地使用 ISO-8859-1 而不是 UTF-8。您已经将 JSP 页面编码设置为 UTF-8,并且输入流显然包含 UTF-8 字节,所以这部分没问题。
    • 您的解决方案有效。我发现我没有管理另一个关键字符串作为 UTF-8。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2018-08-20
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多