2011-05-15 101 views
2

我正在开发使用JSF 1.1的工具,我有这样的问题: 我有我的支持bean一个字符串,它打印为:字符编码1.1

./src.cpp: In function ‘int main()’: 
./src.cpp:4: error: ‘dsdada’ was not declared in this scope 

上的txt文件。

但是,当我把它放在H:inputTextArea,它是这样的:

./src.cpp: In function ‘int main()’: 
./src.cpp:4: error: ‘dsdada’ was not declared in this scope 

-

<%@ page contentType="text/html;charset=UTF-8" %> 
and this 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
</head> 

但它也不能工作。 有人可以告诉我如何解决这个问题。由于

/* String[0] as stdout, String[1] as stderr */ 
String[] results = sshBO.execCommand(cmd, timeout); 

/* Done with SSH things */ 
sshBO.closeSession(); 

/* Bring the output and err to the presentation */ 
msg = results[1]+results[0]; 
FileServices.saveStringToFile("F:/myoutput.txt", msg); 
msg = new String(msg.getBytes("UTF8"), "UTF8"); /* makes no difference */ 

在JSP页面:

<%@ page contentType="text/html;charset=UTF-8" %> 
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> 
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> 
<%@ taglib uri="http://sakaiproject.org/jsf/sakai" prefix="sakai" %> 

<f:view > 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
</head> 
... 

<h:inputTextarea disabled="true" value="#{SSH.msg}" styleClass="myTextArea" /> 

回答

1

字符存在以Unicode字节0xE2 0x80 0x98的。当您使用CP1252(Windows默认)编码来编码这些字节时,您会得到‘

您需要明确将pageEncoding设置为UTF-8。

<%@ page pageEncoding="UTF-8" %> 

这样,它会使用UTF-8 隐含设置Content-Type头右侧打印的字符。

+0

感谢BalusC,我尝试在我的页面中添加<%@ page pageEncoding =“UTF-8”%>,但它似乎不起作用。发生同样的问题。还有什么我应该尝试?顺便说一下,你有一个伟大的博客。我没有学习从你的博客上传文件:)。 – HoaPhan 2011-05-17 14:34:31

0

为了确定转码错误的来源,每个转码操作之后检查数据。使用工具like this one来确定值应该是什么。

例如,您的JSP编写器将Java字符串从UTF-16(Java字符串的编码)转换为UTF-8。其他代码转换操作看起来像从本地系统读取程序输出。

/* String[0] as stdout, String[1] as stderr */ 
String[] results = sshBO.execCommand(cmd, timeout); 

例如,您可以使用这样的代码可以打印字符串的十六进制值:

for (char ch : msg.toCharArray()) 
    System.out.format("%04x ", (int) ch); 

的代码点2018打印。您的文件编写代码可能与读取输入的代码存在类似的错误,会误导您解决问题的根源。


msg = new String(msg.getBytes("UTF8"), "UTF8"); /* makes no difference */ 

这使得没有区别,因为它需要UTF-16的数据,它转码为UTF-8,然后转码回UTF-16。但除此之外,如果你的字符串损坏了,已经太晚了。你正在修复错误的地方。