天天看點

《Java安全編碼标準》一2.13 IDS12-J在不同的字元編碼中無損轉換字元串資料

在string對象之間進行轉換時,如果涉及不同的編碼類型,可能會導緻資料丢失。

根據java api[api 2006] 對?string.getbytes(charset)方法的描述:

該方法總會替代那些錯誤格式的輸入和不可映射的字元序列,把它們替換成這些字元的位元組數組。

當必須将一個string轉化為位元組數組時,例如寫入一個檔案,并且在這個字元串中含有不可映射的字元序列的時候,就必須進行正确的字元編碼。

當string包含那些指定在charset中不能正常表示的字元時,這個不符合規則的代碼示例[hornig 2007]會破壞資料。

java.nio.charset.charsetencoder類可以将一個16位的unicode字元轉換為指定charset的一組位元組資料。java.nio.charset.character-decoder用來完成相反的過程[api 2006]。具體的詳情可以參考規則fio11-j。

這個方案[hornig 2007]使用了charsetencoder?和?charsetdecoder兩個類來處理編碼轉換問題。

這個代碼示例[hornig 2007]想要将一個字元串以特殊的編碼方式附加到一個文本檔案上,但這樣會導緻錯誤,因為string中可能包含無法正确表示的字元。

這個方案[hornig 2007]使用charsetencoder?類來完成所需要的功能。

可以使用fileinputstream?和inputstreamreader對象來從檔案中讀取資料。這個inputstreamreader對象接受可選的charsetdecoder作為參數,但這個參數必須和前面寫入檔案時保持一緻。

使用非标準化的方法來處理和字元集轉換相關的問題,通常會導緻資料丢失。

《Java安全編碼标準》一2.13 IDS12-J在不同的字元編碼中無損轉換字元串資料
《Java安全編碼标準》一2.13 IDS12-J在不同的字元編碼中無損轉換字元串資料
《Java安全編碼标準》一2.13 IDS12-J在不同的字元編碼中無損轉換字元串資料