2011-05-15 99 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。但除此之外,如果你的字符串損壞了,已經太晚了。你正在修復錯誤的地方。