2009-09-23 151 views
3

是否有方法使用Java將ANSI字符串轉換爲UTF。使用Java將ANSI字符轉換爲UTF-8

我有一個自定義序列化程序,它使用readUTF & DataInputStream類的writeUTF方法來反序列化和序列化字符串。如果我收到一個以ANSI編碼的字符串,並且時間太長,那麼〜100000個字符長度就會出錯;

產生的原因: java.io.UTFDataFormatException: 編碼字符串太長:106958個字節

然而,在我的JUnit測試我能創建一個字符串120000「一的,它完美的作品

我檢查了以下帖子,但仍然有錯誤;

+0

您的意思是ASCII?如果是這樣,它已經在UTF-8中 - 你能解釋一下嗎? 顯示錯誤等 – Mark 2009-09-23 14:03:57

+3

否ANSI!= ASCII。 ANSI是一組完整的代碼頁。 – 2009-09-23 14:22:10

+0

由於readUTF和writeUTF的大小限制,我修改了我的序列化程序發送文本的部分 – n002213f 2009-10-03 11:07:05

回答

6

此錯誤不是由字符編碼引起的。這意味着UTF數據的長度是錯誤的。

編輯:剛纔意識到這是一個寫錯誤,沒有讀錯誤。

UTF長度只有2個字節,所以它只能容納64K UTF-8字節。你正在努力寫100K,它不會工作。

此限制是硬編碼,並沒有辦法來解決這個問題,

if (utflen > 65535) 
    throw new UTFDataFormatException(
      "encoded string too long: " + utflen + " bytes"); 
+0

有趣,但爲什麼我的所有測試都有更多的人物通過? – n002213f 2009-09-23 14:50:05

+0

你必須讓我看看你的測試用例。他們錯了。查看我的編輯。 – 2009-09-23 14:52:00

+0

我使用下面的代碼來生成測試字符串; StringBuffer sb2 = new StringBuffer(); \t \t for(int i = 0; i <120000; i ++){ \t \t \t sb2.append(「a」); \t \t} \t \t String longString2 = sb2.toString(); – n002213f 2009-09-23 14:59:49

3
byte[] asciiBytes = ...; 
String unicode = new String(asciiBytes, "US-ASCII"); 
byte[] utfBytes = unicode.getBytes("UTF-8"); 
+0

看來我誤解了有關ASCII與ANSI的原始問題,並且對於最新的問題編輯,我的回答並不真正相關。 – iammichael 2009-09-24 13:42:57

2

哪個ANSI codepage?有很多不同的字符編碼都涉及到「ANSI」。 DOS代碼頁是437(沒有繪圖符號)。如果使用代碼850,這將工作:

String unicode = new String(bytes, "IBM850"); 

(其中bytes與ANSI字符數組)。之後,您可以使用unicode.getBytes(encoding)將此字符串轉換爲任何編碼的字節數組。

Windows經常使用代碼頁1252(爲此使用「windows-1252」)。

+0

試過但不起作用,我得到同樣的錯誤。有沒有辦法檢查字符串中的編碼,以便我可以確定它的ANSI? – n002213f 2009-09-23 15:02:17

+0

這會將ANSI從telnet轉換成一個「常規」字符串嗎? – Thufir 2013-09-05 00:01:45

+0

這會將來自任何源的字節轉換爲Unicode字符串。但爲了正常工作,您需要確切知道源使用哪種編碼。無論這是文件,遠程服務還是硬件設備。 – 2013-09-05 08:04:10

1

ZZ編碼器已經回答了這個問題,但我已經寫了更詳細的解釋,並建議在this blog一種解決方法。基本上,問題出在DataOutputStream上,因爲它將可寫字符串限制爲64KB。還有其他可能的解決方法來逐步解決這個問題,有些可能不會破壞正在使用的實際二進制數據格式...