1. 程式人生 > >Linux字元編碼方式

Linux字元編碼方式

首先,解釋一下字符集:

漢字編碼:
* GB2312字集是簡體字集,全稱為GB2312(80)字集,共包括國標簡體漢字6763個。 * BIG5字集是臺灣繁體字集,共包括國標繁體漢字13053個。 * GBK字集是簡繁字集,包括了GB字集、BIG5字集和一些符號,共包括21003個字元。 * GB18030是國家制定的一個強制性大字集標準,全稱為GB18030-2000,它的推出使漢字集有了一個“大一統”的標準。

ASCII:
American Standard Code for Information Interchange,美國資訊交換標準碼。 目前計算機中用得最廣泛的字符集及其編碼,由美國國家標準局(ANSI)制定。 它已被國際標準化組織(ISO)定為國際標準,稱為ISO 646標準。 ASCII字符集由控制字元和圖形字元組成。 在計算機的儲存單元中,一個ASCII碼值佔一個位元組(8個二進位制位),其最高位(b7)用作奇偶校驗位。 所謂奇偶校驗,是指在程式碼傳送過程中用來檢驗是否出現錯誤的一種方法,一般分奇校驗和偶校驗兩種。 奇校驗規定:正確的程式碼一個位元組中1的個數必須是奇數,若非奇數,則在最高位b7添1。 偶校驗規定:正確的程式碼一個位元組中1的個數必須是偶數,若非偶數,則在最高位b7添1。

UTF:
Unicode 的實現方式不同於編碼方式。 一個字元的Unicode編碼是確定的,但是在實際傳輸過程中,由於不同系統平臺的設計不一定一致,以及出於節省空間的目的,對Unicode編碼的實現方式有所不同。 Unicode的實現方式稱為Unicode轉換格式(Unicode Translation Format,簡稱為 UTF)。 * UTF-8: 8bit變長編碼,對於大多數常用字符集(ASCII中0~127字元)它只使用單位元組,而對其它常用字元(特別是朝鮮和漢語會意文字),它使用3位元組。 * UTF-16: 16bit編碼,是變長碼,大致相當於20位編碼,值在0到0x10FFFF之間,基本上就是unicode編碼的實現,與CPU字序有關。
注意:ASCII char (2) ;UTF-8 寬字元 wchar 4倍 。相容性最好的編碼就是UTF-8! 畢竟GBK/GB2312是國內的標準,當我們大量使用國外的開源軟體時,UTF-8才是編碼界最通用的語言。

在Linux 中通過locale 來設定程式執行的不同語言環境,locale 由ANSI C 提供支援。locale 的命名規則為< 語言>_< 地區>.< 字符集編碼> ,如zh_CN.UTF-8 ,zh 代表中文,CN 代表大陸地區,UTF-8 表示字符集。在locale 環境中,有一組變數,代表國際化環境中的不同設定:
1.    LC_COLLATE
定義該環境的排序和比較規則
2.    LC_CTYPE
用於字元分類和字串處理,控制所有字元的處理方式,包括字元編碼,字元是單位元組還是多位元組,如何列印等。是最重要的一個環境變數。
3.    LC_MONETARY
貨幣格式
4.    LC_NUMERIC
非貨幣的數字顯示格式
5.    LC_TIME
時間和日期格式
6.    LC_MESSAGES
提示資訊的語言。另外還有一個LANGUAGE 引數,它與LC_MESSAGES 相似,但如果該引數一旦設定,則LC_MESSAGES 引數就會失效。LANGUAGE 引數可同時設定多種語言資訊,如LANGUANE="zh_CN.GB18030:zh_CN.GB2312:zh_CN" 。
7.    LANG
LC_* 的預設值,是最低級別的設定,如果LC_* 沒有設定,則使用該值。類似於 LC_ALL 。
8.    LC_ALL
它是一個巨集,如果該值設定了,則該值會覆蓋所有LC_* 的設定值。注意,LANG 的值不受該巨集影響。
一個例子:
設定前,使用預設locale

[[email protected] ~]# locale

LANG="POSIX"

LC_CTYPE="POSIX"

LC_NUMERIC="POSIX"

LC_TIME="POSIX"

LC_COLLATE="POSIX"

LC_MONETARY="POSIX"

LC_MESSAGES="POSIX"

LC_PAPER="POSIX"

LC_NAME="POSIX"

LC_ADDRESS="POSIX"

LC_TELEPHONE="POSIX"

LC_MEASUREMENT="POSIX"

LC_IDENTIFICATION="POSIX"

LC_ALL=
設定後,使用zh_CN.GDK
中文locale

[[email protected] ~]# export LC_ALL=zh_CN.GBK

[[email protected] ~]# locale

LANG=zh_CN.UTF-8

LC_CTYPE="zh_CN.GBK"

LC_NUMERIC="zh_CN.GBK"

LC_TIME="zh_CN.GBK"

LC_COLLATE="zh_CN.GBK"

LC_MONETARY="zh_CN.GBK"

LC_MESSAGES="zh_CN.GBK"

LC_PAPER="zh_CN.GBK"

LC_NAME="zh_CN.GBK"

LC_ADDRESS="zh_CN.GBK"

LC_TELEPHONE="zh_CN.GBK"

LC_MEASUREMENT="zh_CN.GBK"

LC_IDENTIFICATION="zh_CN.GBK"

LC_ALL=zh_CN.GBK
"C" 是系統預設的locale ,"POSIX" 是"C" 的別名。所以當我們新安裝完一個系統時,預設的locale 就是C 或POSIX 。
在Debian 中安裝locales 的方法如下:
· 通過apt-get install locales 命令安裝locales 包
· 安裝完成locales 包後,系統會自動進行locale 配置,你只要選擇所需的locale ,可以多選。最後指定一個系統預設的locale 。這樣系統就會幫你自動生成相應的locale 和配置好系統的locale 。
· 增加新的locale 也很簡單,用dpkp-reconfigure locales 重新配置locale 即可。
· 我們也可手動增加locale ,只要把新的locale 增加到/etc/locale.gen 檔案中,再執行locale-gen 命令即可生成新的locale 。再通過設定 上面介紹的LC_* 變數就可設定系統的locale 了。下是一個locale.gen 檔案的樣例。
·# This file lists locales that you wish to have built. You can find a list

·# of valid supported locales at /usr/share/i18n/SUPPORTED. Other

·# combinations are possible, but may not be well tested. If you change

·# this file, you need to rerun locale-gen.

·#

·zh_CN.GBK GBK

·zh_CN.UTF-8 UTF-8
-----------------------------------------
在我看來只要搞清楚LANG和SUPPORTED就OK了,其他可能平時也用不太多。再參考篇文章,如下,是講如何設定環境變數的。
-------------------------------------------
修改 /etc/sysconfig/i18n 檔案,如
LANG="en_US.UTF-8",xwindow會顯示英文介面,
LANG="zh_CN.GB18030",xwindow會顯示中文介面。
還有一種方法 cp /etc/sysconfig/i18n $HOME/.i18n
修改 $HOME/.i18n 檔案,如
LANG="en_US.UTF-8",xwindow會顯示英文介面,
LANG="zh_CN.GB18030",xwindow會顯示中文介面。
這樣就可以改變個人的介面語言,而不影響別的使用者

修改後的/etc/sysconfig/i18n 檔案為:
LANG="en_US.UTF-8"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
LC_ALL="en_US.UTF-8"
export LC_ALL

設定完畢後重啟或者用rc.local使生效
或修改登入使用者的.bash_profile檔案加入
export LANG=zh_CN.GB18030
export LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN

-----------------------------------------------------------------------------------------------

一定要知道Windows XP 是GB2312的編碼,如果你的伺服器字符集不是這個,估計就會是亂碼,所以要調整。

有些人在調整的時候,說我改了系統環境變數,結果造成使用者內容顯示亂碼,無非解決的方法就是兩個:
1.用iconv轉化為目前的編碼
2.用你原來使用的編碼

看了這兩條,你肯定必須要明確,你原來的字元編碼是如何的。說來說去,無非就是LANG SUPPORTED 和你原檔案字符集的編碼:)
當然了locale -a你可以看看目前系統裡支援的字符集,如果不支援,還要安裝奧。


相關推薦

Linux字元編碼方式

首先,解釋一下字符集: 漢字編碼: * GB2312字集是簡體字集,全稱為GB2312(80)字集,共包括國標簡體漢字6763個。 * BIG5字集是臺灣繁體字集,共包括國標繁體漢字13053個。 * GBK字集是簡繁字集,包括了GB字集、BIG5字集和一些符號,共包括21

linux中修改mysql的字元編碼方式

當發現navicat中建立的資料庫編碼和表編碼都是utf8,但通過web端或者其他方式儲存的資料是亂碼,這時就要考慮是否是安裝mysql時,沒有配置mysql伺服器的編碼格式。 檢查mysql伺服器的編碼格式 1)登入mysql客戶端:mysql -uroot -p 2)查詢

C++的三種字元編碼方式

WCHAR wchar_t wchar_t LPSTR zero-terminated string of char (char*) zero-terminated string of char (char*) LPCSTR constant zero-terminated string of char (c

[智慧家居]Linux 字元編碼的轉換

1.專案需求:GB2312轉UTF編碼 2.思路:iconv庫的使用 3.程式碼例項 /************************************************ * @FileName : gb2utf.c * @Description :

各種字元編碼方式詳解及由來(ANSI,UNICODE,UTF-8,GB2312,GBK)

    一直對字元的各種編碼方式懵懵懂懂,什麼ANSI、UNICODE、UTF-8、GB2312、GBK、DBCS、UCS……是不是看的很暈,假如您細細的閱讀本文你一定可以清晰的理解他們。Let's go!                很久很久以前,有一群人,他們決定用8個可以開合的電晶體來組合成不同的狀

Linux字元編碼預設為UTF-8,如出現亂碼可設定為GBK 1.手動更改profile檔案的命令: vi /etc/profile 也可以修改 /etc/sysconfig/i18n 檔案,如

Linux字元編碼預設為UTF-8,如出現亂碼可設定為GBK 1.手動更改profile檔案的命令: vi /etc/profile也可以修改 /etc/sysconfig/i18n 檔案,如 LANG="en_US.UTF-8" LANG="zh_CN.GB18030"

JS 和 Java 中URL特殊字元編碼方式

 JavaScript   1.  編碼 escape(String)     其中某些字元被替換成了十六進位制的轉義序列。    解碼 unescape(String)     該函式的工作原理是這樣的:通過找到形式為 %xx 和 %uxxxx 的字元序列(x

常見的幾種字元編碼方式 ASCII Unicode UTF-8 GBK

在設計資料庫和網頁程式編寫的時候,經常涉及到一些編碼方式的問題,在此總結一下! 原文地址:http://blog.csdn.net/csywwx2008/article/details/17137097 常見的一些字元編碼方式無非有:Unicode、ASCII、GBK

檢視Linux字元編碼:

#more /etc/sysconfig/i18n 如果LANG=”en_US.UTF-8”,需修改為:LANG=”zh_CN.UTF-8”,設定方法如下: 手動更改配置檔案的命令 shell> vi /etc/sysconfig/i18n 將LANG=”en_US

計算機系統通用的字元編碼方式

 在計算機記憶體中,統一使用Unicode編碼, 當需要儲存到硬碟或者需要傳輸的時候, 就轉換為UTF-8編碼。 用記事本編輯的時候,從檔案讀取的UTF-8字元被轉換為Unicode字元到記憶體裡, 編輯完成後,儲存的時候再把Unicode轉換為UTF-8儲存到檔案。

中文字元佔用位元組數在不同編碼方式下的區別

一次腦洞大開,想寫一個隨機生成中文瑪麗蘇名字的php小指令碼,需要從檔案中逐一讀取中文字元。 本來想說用fgetc()一個一個讀取字元,後來突然發現fgetc()是一次讀取一個位元組,對於英文字元來說沒有問題,但是對於中文字元,每個字元佔用兩個位元組,這樣就行

有關寬字元wchar_t編碼方式的問題

在工程檔案時,常常遇到字元亂碼的問題,查了下,歸結於寬字元wchar_t和窄字元char的區別。 簡單說下這兩者之間的區別: 1、char是8bit資料,能表示ASCII碼中前256個字元,包括前128個可見字元和後128個不可見字元。 2、wchar_t

linux c 字元編碼轉換函式 iconv

一、利用iconv函式族進行編碼轉換 在LINUX上進行編碼轉換時,既可以利用iconv函式族程式設計實現,也可以利用iconv命令來實現,只不過後者是針對檔案的,即將指定檔案從一種編碼轉換為另一種編碼。 iconv函式族的標頭檔案是iconv.h,使用前需包含之。 #

Java不同編碼方式,中英文字元所佔位元組數

1 public class Test { 2 3 public static void main(String[] args){ 4 5 String[] charsetNames={ 6

linux修改預設編碼方式

檢視linux編碼方式命令:locale    如圖,linux預設的編碼方式為utf-8。windows預設的編碼方式為GBK,在windows下編輯的中文,在linux中會顯示為亂碼,修改linux的預設編碼方式為GBK,就可以解決亂碼問題。方法:vim /etc/pro

linux 下更改檔名編碼方式

情景描述:    網站上有一些課件資源,課件資源是從windows上傳到Linux伺服器,原檔名為gbk編碼模式,而瀏覽器預設的編碼模式為utf-8(伺服器預設編碼也為utf-8),如此,便導致了類似h

字元的幾種編碼方式

無論在是在編輯文字檔案的時候,還是在製作網頁的時候,總會遇到文字編碼方式的問題。如果處理不當,就會出現亂碼的問題。因此,有必要對文字的編碼方式做一個詳盡的瞭解。 常見的一些字元編碼方式無非有:Unicode、ASCII、GBK、GB2312、UTF-8。下面先對常見的這一些

Linux Uduntu 18.04 mysql服務的字元編碼修改

第一個部落格,如果寫的不對請指出。第一步在資料庫裡輸入 檢視字元編碼格式show variables like 'character_set_%';第二步修改字元編碼格式  開啟終端先檢視mysql的安裝路徑cd  /etc/mysql/  ls修改字元編碼sudo vi /

Linux下MySQL出現亂碼的解決方法以及如何設定編碼方式

開發環境 Cent OS 7.0; MySQL:Server version: 5.6.33 MySQL Community Server (GPL) 最新版:Server version: 5.7.19 MySQL Community Server (G

Linux下漢字編碼方式UTF-8,Windows下面是GB2312

Linux和Windows下面的漢字編碼不一樣,Linux下面是UTF-8,Windows下面是GB2312,正是由於編碼格式不相同從而導致亂碼。 幾種解決方法如下: 1、在Windows上用記事本開啟,選擇檔案另存為編碼方式改為UTF-8。 2、在Linux上用v