日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

unix系统编码 java_Java 正确的做字符串编码转换

發布時間:2023/12/19 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unix系统编码 java_Java 正确的做字符串编码转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

字符串的內部表示?

字符串在java中統一用unicode表示( 即utf-16 LE) ,

對于?String s = "你好哦!";

如果源碼文件是GBK編碼, 操作系統(windows)默認的環境編碼為GBK,那么編譯時, ?JVM將?按照GBK編碼將字節數組解析成字符,然后將字符轉換為unicode格式的字節數組,作為內部存儲。

當打印這個字符串時,JVM 根據操作系統本地的語言環境,將unicode轉換為GBK,然后操作系統將GBK格式的內容顯示出來。

當源碼文件是UTF-8, 我們需要通知編譯器源碼的格式,javac -encoding utf-8 ... , 編譯時,JVM按照utf-8 解析成字符,然后轉換為unicode格式的字節數組, 那么不論源碼文件是什么格式,同樣的字符串,最后得到的unicode字節數組是完全一致的,顯示的時候,也是轉成GBK來顯示(跟OS環境有關)

亂碼如何產生?本質上都是由于 字符串原本的編碼格式 與 讀取時解析用的編碼格式不一致導致的。

例如:

String s = "你好哦!";

System.out.println( new String(s.getBytes(),"UTF-8")); //錯誤,因為getBytes()默認使用GBK編碼, 而解析時使用UTF-8編碼,肯定出錯。

其中 getBytes() 是將unicode 轉換為操作系統默認的格式的字節數組,即"你好哦"的 GBK格式,

new String (bytes, Charset) 中的charset 是指定讀取 bytes 的方式,這里指定為UTF-8,即把bytes的內容當做UTF-8 格式對待。

如下兩種方式都會有正確的結果,因為他們的源內容編碼和解析用的編碼是一致的。

System.out.println( new String(s.getBytes(),"GBK"));

System.out.println( new String(s.getBytes("UTF-8"),"UTF-8"));

那么,如何利用getBytes 和 new String() 來進行編碼轉換呢?網上流傳著一種錯誤的方法:

GBK--> UTF-8: ? ?new String( s.getBytes("GBK") , "UTF-8); ? ,這種方式是完全錯誤的,因為getBytes 的編碼與 ?UTF-8 不一致,肯定是亂碼。

但是為什么在tomcat 下,使用 new String(s.getBytes("iso-8859-1") ,"GBK") 卻可以用呢? 答案是:

tomcat 默認使用iso-8859-1編碼, 也就是說,如果原本字符串是GBK的,tomcat傳輸過程中,將GBK轉成iso-8859-1了,

默認情況下,使用iso-8859-1讀取中文肯定是有問題的,那么我們需要將iso-8859-1 再轉成GBK, 而iso-8859-1 是單字節編碼的,

即他認為一個字節是一個字符, 那么這種轉換不會對原來的字節數組做任何改變,因為字節數組本來就是由單個字節組成的,

如果之前用GBK編碼,那么轉成iso-8859-1后編碼內容完全沒變, 則 s.getBytes("iso-8859-1") ?實際上還是原來GBK的編碼內容

則?new String(s.getBytes("iso-8859-1") ,"GBK") ?就可以正確解碼了。 所以說這是一種巧合。

如何正確的將GBK轉UTF-8 ? (實際上是unicode轉UTF-8)

String gbkStr = "你好哦!"; //源碼文件是GBK格式,或者這個字符串是從GBK文件中讀取出來的, 轉換為string 變成unicode格式

//利用getBytes將unicode字符串轉成UTF-8格式的字節數組

byte[] utf8Bytes = gbkStr.getBytes("UTF-8");

//然后用utf-8 對這個字節數組解碼成新的字符串

String utf8Str = new String(utf8Bytes, "UTF-8");

簡化后就是:

unicodeToUtf8 (String s) {

return new String( s.getBytes("utf-8") , "utf-8");

}

UTF-8 轉GBK原理也是一樣

return new String( s.getBytes("GBK") , "GBK");

其實核心工作都由 ?getBytes(charset) 做了。

getBytes 的JDK 描述:Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.

另外對于讀寫文件,

OutputStreamWriter w1 = new OutputStreamWriter(new FileOutputStream("D:\\file1.txt"),"UTF-8");

InputStreamReader( stream, charset)

可以幫助我們輕松的按照指定編碼讀寫文件。

轉自:

總結

以上是生活随笔為你收集整理的unix系统编码 java_Java 正确的做字符串编码转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩黄色片网站 | 日本久久久久久久久久久 | 亚洲女人视频 | 小宵虎南在线观看 | 日韩欧美电影一区二区三区 | 国产欧美精品一区二区三区 | 在线免费观看一区 | 91传媒视频在线观看 | 久久久久久久伊人 | 91精品国产综合久久香蕉 | 天天看夜夜看 | 亚洲无限av | 成人免费在线视频 | 国产精品毛片在线 | 成人午夜性视频 | 91免费在线视频观看 | 天堂a在线 | 久久99深爱久久99精品 | 精品国产一二三区 | 蜜臀久久99精品久久久久宅男 | 老司机激情视频 | 500福利视频导航 | 日韩精品大片 | 91久久精品国产 | 中文字幕7 | 天天操天天干天天舔 | 在线观看免费黄网站 | 88av网 | 先锋影音av在线 | 无码人妻一区二区三区在线 | 香蕉视频毛片 | 超碰97自拍 | 永久免费成人 | 大奶子网站 | 女人洗澡一级特黄毛片 | 午夜精品久久久久久久无码 | 日本黄大片在线观看 | avtt在线观看 | 制服丝袜国产精品 | 视频在线观看电影完整版高清免费 | 亚洲av成人无码久久精品老人 | 黄色永久网站 | 久久久久亚洲av无码麻豆 | 日韩欧美亚洲天堂 | 欧美日韩大陆 | 黄色片小视频 | 精品国产丝袜一区二区三区乱码 | 午夜精品久久99蜜桃的功能介绍 | 成人午夜视频在线 | 成人综合激情网 | 97视频久久久| 久久人人妻人人人人妻性色av | 中文字幕永久在线播放 | 男女爱爱网站 | 一级淫片免费 | 久久久久久久久久久久久久久 | 亚洲综合首页 | 天堂av片 | www.波多野结衣.com | 天天干天天操心 | 亚洲AV无码久久精品色三人行 | 黄色国产一区 | 亚洲精品无 | 在线中文字幕一区 | 91成人在线观看喷潮动漫 | 日日碰碰| 欧美啪啪网站 | 国产精品视频久久久久久 | 俄罗斯videodesxo极品 | 久爱精品| 日韩欧美不卡视频 | 超碰88| 国产精品白浆一区二小说 | 中文字幕人妻无码系列第三区 | 二区三区在线观看 | 欧美激情18| 狠狠干中文字幕 | 1024国产视频 | 日韩久久久久 | 法国空姐在线观看免费 | 国产精品久久久亚洲 | 美女100%视频免费观看 | 91麻豆精品国产91久久久无需广告 | 国产精品乱码久久久久 | 91大奶| 手机av中文字幕 | 国产天天骚 | 欧美激情在线狂野欧美精品 | 男男受被啪到高潮自述 | 日本在线观看视频网站 | 在线免费观看黄 | 123超碰 | 免费成人深夜小野草 | 国产999精品久久久久久 | 丁香婷婷六月 | 国产美女被草 | 中国一级大黄大黄大色毛片 | 精品人妻一区二区三区蜜桃 | 午夜亚洲av永久无码精品 |