1. 程式人生 > >從中文問題的來源解決中文亂碼問題(一)

從中文問題的來源解決中文亂碼問題(一)

一、中文問題的來源

計算機最初的作業系統支援的編碼是單位元組的字元編碼,於是,在計算機中一切處理程式最初都是以單位元組編碼的英文為準進行處理。隨著計算機的發展,為了適應世界其它民族的語言(當然包括我們的漢字),人們提出了UNICODE編碼,它採用雙位元組編碼,相容英文字元和其它民族的雙位元組字元編碼,所以,目前,大多數國際性的軟體內部均採用UNICODE編碼,在軟體執行時,它獲得本地支援系統(多數時間是作業系統)預設支援的編碼格式,然後再將軟體內部的UNICODE轉化為本地系統預設支援的格式顯示出來。JavaJDKJVM即是如此,我這裡說的JDK是指國際版的JDK,我們大多數程式設計師使用的是國際化的

JDK版本,以下所有的JDK均指國際化的JDK版本。我們的漢字是雙位元組編碼語言,為了能讓計算機處理中文,我們自己制定的gb2312GBKGBK2K等標準以適應計算機處理的需求。所以,大部分的作業系統為了適應我們處理中文的需求,均定製有中文作業系統,它們採用的是GBK,GB2312編碼格式以正確顯示我們的漢字。如:中文Win2K預設採用的是GBK編碼顯示,在中文WIN2k中儲存檔案時預設採用的儲存檔案的編碼格式也是GBK的,即,所有在中文WIN2K中儲存的檔案它的內部編碼預設均採用GBK編碼,注意:GBK是在GB2312基礎上擴充來的。

由於Java語言內部採用UNICODE編碼,所以在JAVA

程式執行時,就存在著一個從UNICODE編碼和對應的作業系統及瀏覽器支援的編碼格式轉換輸入、輸出的問題,這個轉換過程有著一系列的步驟,如果其中任何一步出錯,則顯示出來的漢字就會出是亂碼,這就是我們常見的JAVA中文問題。

同時,Java是一個跨平臺的程式語言,也即我們編寫的程式不僅能在中文windows上執行,也能在中文Linux等系統上執行,同時也要求能在英文等系統上執行(我們經常看到有人把在中文win2k上編寫的JAVA程式,移植到英文Linux上執行)。這種移植操作也會帶來中文問題。

還有,有人使用英文的作業系統和英文的IE等瀏覽器,來執行帶中文字元的程式和瀏覽中文網頁,它們本身就不支援中文,也會帶來中文問題。

有,幾乎所有的瀏覽器預設在傳遞引數時都是以UTF-8編碼格式來傳遞,而不是按中文編碼傳遞,所以,傳遞中文引數時也會有問題,從而帶來亂碼現象。

總之,以上幾個方面是JAVA中的中文問題的主要來源,我們把以上原因造成的程式不能正確執行而產生的問題稱作:JAVA中文問題。

2JAVA編碼轉換的詳細過程

我們常見的JAVA程式包括以下類別:

*直接在console上執行的類(包括視覺化介面的類)

*JSP程式碼類(注:JSPServlets類的變型)

*Servelets

*EJB

*其它不可以直接執行的支援類

這些類檔案中,都有可能含有中文字串,並且我們常用前三類JAVA程式和使用者直接互動,用於輸出和輸入字元,如:我們在JSPServlet中得到客戶端送來的字元,這些字元也包括中文字元。無論這些JAVA類的作用如何,這些JAVA程式的生命週期都是這樣的:

*程式設計人員在一定的作業系統上選擇一個合適的編輯軟體來實現源程式程式碼並以.java副檔名儲存在作業系統中,例如我們在中文win2k中用記事本編輯一個java源程式;

*程式設計人員用JDK中的javac.exe來編譯這些原始碼,形成.class(JSP檔案是由容器呼叫JDK來編譯的)

*直接執行這些類或將這些類佈署到WEB容器中去執行,並輸出結果。

那麼,在這些過程中,JDKJVM是如何將這些檔案如何編碼和解碼並執行的呢?

這裡,我們以中文win2k作業系統為例說明JAVA類是如何來編碼和被解碼的。

第一步,我們在中文win2k中用編輯軟體如記事本編寫一個Java源程式檔案(包括以上五類JAVA程式),程式檔案在儲存時預設採用了作業系統預設支援GBK編碼格式(作業系統預設支援的格式為file.encoding格式)形成了一個.java檔案,也即,java程式在被編譯前,我們的JAVA源程式檔案是採用作業系統預設支援的file.encoding編碼格式儲存的,java源程式中含有中文資訊字元和英文程式程式碼;要檢視系統的file.encoding引數,可以用以下程式碼:

public class ShowSystemDefaultEncoding {

public static void main(String[] args) {

String encoding = System.getProperty("file.encoding");

System.out.println(encoding);

}}

 

相關推薦

Django-1.11中文文檔-模型Models

after 表數據 help var person last attr geo django 模型Models (官方文檔鏈接) 模型是數據信息的唯一並明確的來源。它包含了我們儲存的數據的基本字段和行為。通常,每個模型映射到一張數據庫表。 基本概念: 每個模型都是**dj

中文Analytics Intelligence 問答系統

Google Analytics 推出了自己的Analytics Intelligence 的新功能。 使用者可以用自然語言直接詢問有關的資料問題, 然後便能得到結果。 看一下他們酷炫的功能介紹吧。可以像這樣。 也可以像這樣 可惜這個是全英文的。那有沒有辦法

中文分句的一些想法

介紹   筆者最近在做一個專案,需要用到中文分句,在此過程中有一些自己的想法,想要記錄下來,供讀者或自己以後參考。   所謂中文分句,就是將中文文章或段落中的句子拆分開來。一般,中文句子以。!?結尾,因此,一種自然的想法就是按照這些符號進行切分,但是這樣做效率比較低。另一種想法就是藉助NLTK,它支援多語言應

零開始學習OpenCL開發架構

處理器 多媒體 c++ stl context 實驗 通用 必看 是你 同時存在 1 異構計算、GPGPU與OpenCL OpenCL是當前一個通用的由很多公司和組織共同發起的多CPU\GPU\其他芯片 異構計算(heterogeneous)的標準,它是跨平臺的。旨在充

零開始學Linux系統

系統啟動 linux 自定義 管理 如果 level 技術 int 沒有 Linux系統:分時多用戶多任務的操作系統; Linux系統引導流程: inittab配置文件中: 定義了linux系統的運行的7個級別:從0~6 0、6:分別代表關機和重啟,不建議設置為默認的

【微服務入門到精通】:微服務的藍綠發布及灰度發布

采樣 前端 入門 後端 blog 文件 風險 性能 切換 藍綠部署 基本上,藍綠部署是一種以可預測的方式發布應用的技術,目的是減少發布過程中服務停止的時間。 簡單來說,你需要準備兩個相同的環境(基礎架構),在藍色環境運行當前生產環境中的應用,也就是舊版本應用,如圖中 A

💒 es6 + canvas 開源 蓋樓小遊戲 完整代碼註釋 零教你做遊戲

lock 基於 時間 git cor 默認 掃描 lin tga 蓋樓遊戲 一個基於 Canvas 的蓋樓遊戲 Demo 預覽 在線預覽地址 (Demo Link) 手機設備可以掃描下方二維碼 github https://github.com/bmqb/to

jmeter表格批量讀取數據

數據 數據文件 線程 info image val 配置 響應 說明 1、新建一個文本文檔,重命名為2.csv 2、可以在文檔中設置如下參數;casenum:用例編號;url:訪問路徑;para:訪問的域名;function:請求方式;expectValue:響應值 3、

第一個vue項目——0到1構建vue

第一個 清晰 vue-cli 從0到1 搭建 圖片 數據 綁定 代碼 入職學霸君三周,我的第一個大需求,世界杯活動歷時兩周,剛剛終於上線。這是我第一個實踐中的vue項目,也磕磕絆絆的完成了從react的轉變。以此為記。 首先記錄下菜鳥的學習過程: (1)看個大概 因為每個活

分散式事務 解決資料一致性事務原則與實現:事務、sql事務

事務: 定義:       是以一種可靠、一致的方式,訪問和操作資料庫中資料的程式單元。 原則:      *a、 原子性   * b、一致性  * c、隔離性 &nbs

零開始Vue專案實戰-準備篇

從前參與過一個react專案的程式碼編寫,大神搭建的框架,我主要負責業務邏輯程式碼編寫,現在回想起來似乎又什麼都不會,現在為了鞏固前端知識,決定用Vue來做這個專案的移動端網站,我本人Vue是從零開始的,一邊學習一邊寫程式碼,在這裡記錄一下過程。 專案說明: 主要功能實現一個投資平臺,會員身份為融資人或投

零開始學習敏捷開發

一、敏捷開發--歷史背景:   20世紀60年代:軟體作坊,軟體規模小,以作坊式開發為主;  70年代:軟體危機,硬體飛速發展,軟體規模和複雜度激增,引發軟體危機;  80年代:軟體過程控制,引入成熟生產製造管理方法,以“過程為中心”分階段來控制軟體開發(瀑布模型),一定程度上緩解了軟體危機;  90年代:

零開始學Socket:服務端和客戶端建立

上篇我提到Socket是TCP/IP的抽象介面。所以我們直接使用就好,沒必要知其甚解。 1.開啟VS 新建專案 名稱,位置隨意 這裡名稱是Server 框架選.NET 4.5(在這篇部落格裡也無所謂) 注意引用 using System.Net; using

vue外掛開發流程詳解-開發到釋出至npm

 vue的外掛開發 1.本地開發   1.1 初始化本地開發專案        1.2 test.js 的內容 ,這是外掛的入口檔案      test.js的程式碼如下: import testPanel from './panel.vue

Flutter入門教程:零構建電商應用

在這個系列中,我們將學習如何使用google的移動開發框架flutter建立一個電商應用。 本文是flutter框架系列教程的第一部分,將學習如何安裝Flutter開發環境並建立第一個 Flutter應用,並學習Flutter應用開發中的核心概念,例如widget、狀態等。 本系列教

【Flutter教程】零構建電商應用

在這個系列中,我們將學習如何使用google的移動開發框架flutter建立一個電商應用。本文是flutter框架系列教程的第一部分,將學習如何安裝Flutter開發環境並建立第一個Flutter應用,並學習Flutter應用開發中的核心概念,例如widget、狀態等。 本系列教程包含如下四個部分,敬請期待:

【Flutter入門教程】零構建電商應用

在這個系列中,我們將學習如何使用google的移動開發框架flutter建立一個電商應用。本文是flutter框架系列教程的第一部分,將學習如何安裝Flutter開發環境並建立第一個Flutter應用,並學習Flutter應用開發中的核心概念,例如widget、狀態等。 本系列教程包含如

Vue + Spring Boot零開始搭建個人網站 之 專案前端Vue.js環境搭建

前言:         最近在考慮搭建個人網站,想了想決定採用前後端分離模式         前端使用Vue,負責接收資料         後端使用Spring Boot,負責提供前端需要的API         就這樣開啟了我邊學習邊實踐之旅 Vue環境搭建步驟:         1、安裝node.js

零開始做SSH專案

  1.資料庫指令碼 使用者表 CREATE TABLE `ybl`.`userinfo`( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(64) NOT NULL, `identity` INT NOT NUL

程式中學習UKF-SLAM

然間從GitHub上發現一個小專案,做的是一個基於UKF的狀態估計,使用C++版本的mathplot做顯示,編譯之後卻發現顯示一直有問題,於是萌生了一個想法:能不能把它移植到ROS中?然後就有了接下來的學習過程,以此記錄。如有問題,歡迎提出。 這是需要複寫的程式