UTF-7

UTF-7(全称:7位元Unicode轉換格式)是一種可變長度字元編碼方式,用以將Unicode字元以ASCII編碼的字元串來呈現,可以應用在電子郵件傳輸之類的應用。

SMTP為基本的電子郵件傳輸標準之一,其指明了傳輸格式為US-ASCII,並且不允許超過ASCII所定義的字元範圍以外的位元值,也就是說八位元的字串將無法正常的被傳輸。MIME(RFC 2045 ~ 2049)擴展了網路郵件以支援不同的媒體類型以及字元集,包含UTF-8與UTF-16的字元集皆可被指定使用。但由於MIME並未明確將Unicode定義為可支援的字元集,並且也沒有說明其應如何編碼,這使得既有的SMTP傳輸架構下仍舊無法保證可正確的處理8位元資料。base64編碼也有其問題,例如甚至連純英文的US-ASCII字元也可能會變成不可辨認;至於像是UTF-8與quoted-printable的編碼結合,則需要6~9個位元來為非ASCII的字元(Unicode的基本多文種平面中定義的字元)進行編碼,至於在基本多文種平面(BMP)以外的字原則需要多達12位元的長度才能完成編碼。

簡介

UTF-7首次被提出是在一個實驗性的通訊協定裏(RFC 1642,A Mail-Safe Transformation Format of Unicode),這份RFC(Request for Comments)提案後來因RFC 2152的提出而被取代(RFC 2152本身為新聞型(informational)的文案)。在RFC 2152當中明確的指出該份RFC本身不為網際網路的標準做出任何明確的定義(明列於文案前頭的Status of this Memo)。儘管這份RFC 2152在IANA(Internet Assigned Numbers Authority)的字元集列表裏被引述為UTF-7,然而UTF-7本身並非Unicode的標準之一,即使在目前最新的Unicode 5.0裏也僅列出UTF-8、UTF-16和UTF-32。

如同引言所提到的,由於在過去SMTP的傳輸僅能接受7位元的字元,而當時Unicode並無法直接滿足既有的SMTP傳輸限制,在這樣地背景下UTF-7被提出。嚴格來說UTF-7不能算是Unicode所定義的字元集之一,較精確的來說,UTF-7是提供了一種將Unicode轉換為7位元US-ASCII字元的轉換方式。

有些字元本身可以直接以單一的ASCII字元來呈現。第一個群組被稱作「direct characters」,其中包含了62個數字與英文字母,以及包含了九個符號字元:' ( ) , - . / : ?。這些「direct characters」被認為可以很安全的直接在文件裡呈現。另一個主要的群組稱作「optional direct characters」,其中包含了所有可被列印的字元,這些字元在U+0020~U+007E之間,除了~ \ +和空白字元以外。這些「optional direct characters」的使用雖可減少空間的使用也可增加人的可閱讀性,但卻會因為一些不良設計的郵件閘道而會產生一些錯誤,導致必須使用額外的跳脫字元。

空白字元、Tab字元、以及換行字元一般雖也可直接是為單一的ASCII字元來使用,然而,若是郵件中有使用了編碼過的字串,則必須特別注意這些字元有無被使用在其他地方。而加號字元+的一種編碼方式可以+-

其他的字元則必須被編碼成UTF-16然後轉換為修改的Base64。這些區塊的開頭會以+符號來標示,結尾則以任何不在Base64裡定義的字元來標示。若是在Base64區塊之後使用-(連字暨減號)標示為結束的話,則解碼器會從下個字元繼續解碼,反之則用此字元當非Base64的區塊的開頭繼續解碼。

範例

  • "Hello, World!"會被編碼為"Hello, World!"
  • "1 + 1 = 2"會被編碼為"1 +- 1 +AD0 2"
  • "£1"會被編碼為"+AKM-1".第一個字元£(英鎊的符號)的Unicode碼為U+00A3(在UTF-16即為00A316),接著轉換至修改的Base64格式,如同下表。表中可見有兩個位元多了出來,被以0填補上。
16進位碼 0 0 A 3  
2進位碼 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0
索引 0 10 12
Base64編碼 A K M

手動編碼與解碼UTF-7的演算法

編碼

首先必須先決定哪些字元呈現為ASCII格式,哪些字元呈現在Unicode區塊。簡單的編碼器可以假設所有的字元皆可以很安全的被直接編碼。然而要將原本屬於Unicode區塊的字元視為ASCII來加以編碼的代價是需要額外的2⅔字元。

Unicode序列一旦被認定後,其必須以下面的程序來加以編碼,併以適當的符號加以標注:

我們將使用£† (0x00A3) (0x2020)字元序列來作為以下的範例。

  1. 將字元的Unicode數值 (UTF-16)以二進位呈現:
    0x00A3 → 0000 0000 1010 0011
    0x2020 → 0010 0000 0010 0000
  2. 將二進位序列合併
    0000 0000 1010 0011 及 0010 0000 0010 0000 → 0000 0000 1010 0011 0010 0000 0010 0000
  3. 重新將二進位序列編組,以六位數為一組,由左開始:
    0000 0000 1010 0011 0010 0000 0010 0000 → 000000 001010 001100 100000 001000 00
  4. 如果最後一組小於六位數,則不足的位數以0補足尾數:
    0000 0000 1010 0011 0010 0000 0010 0000 → 000000 001010 001100 100000 001000 000000
  5. 將每一組六位數的數值以對應的Base64碼取代:
    000000 001010 001100 100000 001000 000000 → AKMgIA

解碼

首先訊息必須被拆分到純文字與Unicode區塊,緊接著Unicode區塊必須以下面的程序來進行解譯(使用上面提到的範例):

  1. 將每一個Base64碼以二進位序列來描述,如下:
    AKMgIA → 000000 001010 001100 100000 001000 000000
  2. 重新將二進位編組,以使其16位數一組,從左開始:
    000000 001010 001100 → 0000000010100011 0010000000100000 0000
  3. 若有其中一組無法完全編成16位數一組,則先排除它:
    0000000010100011 0010000000100000
  4. 每一個16位元的一組二進位碼為Unicode(UTF-16)的數字字元並且可以被改寫為如下:
    0000 0000 1010 0011 ≡ 0x00A3 ≡ 16310

安全性

UTF-7由於允許將相同來源的字串從base64的模式被平移,而顯得安全性薄弱。現今的郵件與傳輸方式由於都已支援UTF-8,UTF-7則已走入歷史而很少再被使用。即便如此,現今的應用軟體仍應更加考量支援更安全的編碼方式。

然而,除了郵件傳輸之外,仍有不少傳輸是採用UTF-7編碼來進行傳輸。近期較著名的安全漏洞發生於Google的搜尋漏洞[1],該漏洞肇因於不當的使用UTF-7編碼於網址資訊上,遠端的攻擊將可讀取或修改網頁內容。

尚未被完整開發的UTF-6和UTF-5

有些可應用於電信電報領域的UTF-6和UTF-5提案已經被提出[2][3],然而,截至2006年止,這些提案尚未被正式的制定出來。

這些提案與Punycode並無相關。

參考

  1. ^ http://www.kb.cert.org/vuls/id/989144 (页面存档备份,存于互联网档案馆), Vulnerability Note VU#989144, Google Mini and Google Search Appliance vulnerable to cross-site scripting
  2. ^ Seng, James, UTF-5, a transformation format of Unicode and ISO 10646 (页面存档备份,存于互联网档案馆), 28 Jan 2000, retrieved 23 Aug 2007
  3. ^ Welter, Mark; Brian W. Spolarich, WALID, Inc. UTF-6 - Yet Another ASCII-Compatible Encoding for IDN. Internet Engineering Task Force (IETF) INTERNET-DRAFT. The Internet Society. 2000-11-16 [2007-08-28]. (原始内容存档于2021-04-28).  引文使用过时参数coauthors (帮助)

相關條目

Unicode
码位
字符
通用字元集字元英语Universal Character Set characters
列表
處理
演算法
統一碼編碼比較英语Comparison of Unicode encodings
組合字符
使用
相關標準
相關主題
 
Unicode收录的文字
收录文字
現代文字
古代文字
標記文字
符號
早期電信
  • 電報電碼英语Telegraph code
    • 庫克與惠斯通英语Cooke and Wheatstone telegraph
    • 摩斯
      • 非拉丁字母英语Morse code for non-Latin alphabets
      • 日文英语Wabun code
      • 中文
      • 西里爾字母英语Russian Morse code
      • 韓文英语SKATS
    • 博多與莫瑞
  • Fieldata英语Fieldata
  • ASCII
  • BCDIC英语BCD (character encoding)
  • 電傳文訊英语Teletex電傳視訊英语Videotex電視資訊
    • T.51/ISO/IEC 6937英语T.51/ISO/IEC 6937
    • ITU T.61英语ITU T.61
    • ITU T.101英语Videotex character set
    • 世界系統電傳文訊英语World System Teletext
      • 字元集英语Teletext character set
ISO/IEC 8859
書目
  • MARC-8英语MARC-8
  • ISO 5426英语ISO 5426
  • ISO 5427英语ISO 5427
  • ISO 5428英语ISO 5428
  • ISO 6438
  • ISO 6862英语ISO 6862
國家標準
ISO/IEC 2022
macOS代码页
  • 亞美尼亞文英语Mac OS Armenian
  • 阿拉伯文
  • 巴倫支西里爾字母英语Mac OS Barents Cyrillic
  • 凱爾特語族英语Mac OS Celtic
  • 中歐語言
  • 克羅埃西亞文英语Mac OS Croatian encoding
  • 西里爾字母英语Mac OS Cyrillic encoding
  • 梵文
  • 波斯文英语MacFarsi encoding
  • 字體X英语Macintosh Font X encoding
  • 蓋爾文英语Mac OS Gaelic
  • 喬治亞文英语Mac OS Georgian
  • 希臘文英语MacGreek encoding
  • 古吉拉特文英语Mac OS Gujarati
  • 古木基文英语Mac OS Gurmukhi
  • 希伯來文英语Mac OS Hebrew
  • 冰島文英语Mac OS Icelandic encoding
  • 因紐特文英语Mac OS Inuit
  • 鍵盤英语Mac OS Keyboard encoding
  • 拉丁文英语Macintosh Latin encoding
  • 馬爾他文/世界文英语Mac OS Maltese/Esperanto encoding
  • 歐甘字母英语Mac OS Ogham
  • 羅曼語族
  • 羅馬尼亞文英语Mac OS Romanian encoding
  • 薩米文英语Mac OS Sámi
  • 土耳其文英语Mac OS Turkish encoding
  • 土耳其西里爾字母英语Mac OS Turkic Cyrillic
  • 烏克蘭文英语Mac OS Ukrainian encoding
  • VT100英语VT100 encoding
DOS代碼頁
  • 437
  • 668英语Code page 668
  • 708英语Code page 708
  • 720英语Code page 720
  • 737英语Code page 737
  • 770英语Code page 770
  • 773英语Code page 773
  • 775英语Code page 775
  • 776英语Code page 776
  • 777英语Code page 777
  • 778英语Code page 778
  • 850英语Code page 850
  • 851英语Code page 851
  • 852英语Code page 852
  • 853英语Code page 853
  • 855英语Code page 855
  • 856英语Code page 856
  • 857英语Code page 857
  • 858英语Code page 858
  • 859英语Code page 859
  • 860英语Code page 860
  • 861英语Code page 861
  • 862英语Code page 862
  • 863英语Code page 863
  • 864英语Code page 864
  • 865英语Code page 865
  • 866英语Code page 866
  • 867英语Code page 867
  • 868英语Code page 868
  • 869英语Code page 869
  • 897英语Code page 897
  • 899英语Code page 899
  • 903英语Code page 903
  • 904英语Code page 904
  • 932英语Code page 932 (IBM)
  • 936英语Code page 936 (IBM)
  • 942英语Code page 942
  • 949英语Code page 949 (IBM)
  • 950
  • 951英语Code page 951
  • 1040英语Code page 1040
  • 1042英语Code page 1042
  • 1043英语Code page 1043
  • 1046英语Code page 1046
  • 1098英语Code page 1098
  • 1115英语Code page 1115
  • 1116英语Code page 1116
  • 1117英语Code page 1117
  • 1118英语Code page 1118
  • 1127英语Code page 1127
  • 3846英语Code page 3846
  • ABICOMP英语ABICOMP character set
  • CS Indic英语CS Indic character set
  • CSX Indic英语CSX Indic character set
  • CSX+ Indic英语CSX+ Indic character set
  • CWI-2英语CWI-2
  • 伊朗系統英语Iran System encoding
  • 卡梅尼茨英语Kamenický encoding
  • 馬索維亞英语Mazovia encoding
  • MIK英语MIK (character set)
IBM AIX代碼頁
  • 895英语Code page 895
  • 896英语Code page 896
  • 912英语Code page 912
  • 915英语Code page 915
  • 921英语Code page 921
  • 922英语Code page 922
  • 1006英语Code page 1006
  • 1008英语Code page 1008
  • 1009英语Code page 1009
  • 1010英语Code page 1010
  • 1012英语Code page 1012
  • 1013英语Code page 1013
  • 1014英语Code page 1014
  • 1015英语Code page 1015
  • 1016英语Code page 1016
  • 1017英语Code page 1017
  • 1018英语Code page 1018
  • 1019英语Code page 1019
  • 1124英语Code page 1124
  • 1133英语Code page 1133
Microsoft Windows代碼頁英语Windows code page
  • CER-GS英语CER-GS
  • 932英语Code page 932 (Microsoft Windows)
  • 936
  • 950
  • 1169英语Code page 1169
  • Extended Latin-8英语Extended Latin-8
  • 1250英语Windows-1250
  • 1251英语Windows-1251
  • 1252
  • 1253英语Windows-1253
  • 1254英语Windows-1254
  • 1255英语Windows-1255
  • 1256英语Windows-1256
  • 1257英语Windows-1257
  • 1258英语Windows-1258
  • 1270英语Windows-1270
  • 西里爾字母+芬蘭文英语Windows Cyrillic + Finnish
  • 西里爾字母+法文英语Windows Cyrillic + French
  • 西里爾字母+德文英语Windows Cyrillic + German
  • 希臘語變音符號英语Windows Polytonic Greek
EBCDIC代碼頁
  • 37英语Code page 37
  • EBCDIC中的日文英语Japanese language in EBCDIC
  • DKOI英语DKOI
DEC終端機(VTx英语VT220
  • MCS英语Multinational Character Set
  • NRCS英语National Replacement Character Set
    • 加拿大法文英语Code page 1020
    • 瑞士文英语Code page 1021
    • 西班牙文英语Code page 1023
    • 英國英文英语Code page 1101
    • 荷蘭文英语Code page 1102
    • 芬蘭文英语Code page 1103
    • 法文英语Code page 1104
    • 挪威文/丹麥文英语Code page 1105
    • 瑞典文英语Code page 1106
    • 挪威文/丹麥文(替代)英语Code page 1107
  • 8位元希臘文英语Code page 1287
  • 8位元土耳其文英语Code page 1288
  • SI 960英语SI 960
  • 希伯來文英语DEC Hebrew
  • 特殊圖形英语DEC Special Graphics
  • 技術英语DEC Technical Character Set
特定平臺
  • 1057英语Code page 1057
  • Acorn英语RISC OS character set
  • Adobe標準英语PostScript Standard Encoding
  • Adobe Latin 1英语PostScript Latin 1 Encoding
  • Amstrad CPC英语Amstrad CPC character set
  • Apple II英语Apple II character set
  • 雅達利資訊交換標準碼英语ATASCII
  • 雅達利ST英语Atari ST character set
  • BICS英语Bitstream International Character Set
  • 卡西歐計算機英语Casio calculator character sets
  • CDC英语CDC display code
  • Compucolor II英语Compucolor II character set
  • CP/M+英语Amstrad CP/M Plus character set
  • DEC RADIX 50英语DEC RADIX 50
  • DEC MCS英语Multinational Character Set/NRCS英语National Replacement Character Set
  • DG國際英语DG International
  • Fieldata英语Fieldata
  • GEM英语GEM character set
  • GSM 03.38英语GSM 03.38
  • HP Roman英语HP Roman
  • HP FOCAL英语FOCAL character set
  • HP RPL英语RPL character set
  • SQUOZE英语SQUOZE
  • LICS英语Lotus International Character Set
  • LMBCS英语Lotus Multi-Byte Character Set
  • MSX英语MSX character set
  • NEC APC英语NEC APC character set
  • NeXT英语NeXT character set
  • PETSCII英语PETSCII
  • SEGA SC-3000英语Sega SC-3000 character set
  • 夏普計算機英语Sharp pocket computer character sets
  • 夏普MZ英语Sharp MZ character set
  • 辛克萊QL英语Sinclair QL character set
  • 符號
  • 電傳文訊英语Teletext character set
  • 德州儀器計算機英语TI calculator character sets
  • TRS-80英语TRS-80 character set
  • 文圖拉國際英语Ventura International
  • WISCII英语Wang International Standard Code for Information Interchange
  • XCCS英语Xerox Character Code Standard
  • ZX80英语ZX80 character set
  • ZX81英语ZX81 character set
  • ZX Spectrum英语ZX Spectrum character set
Unicode通用字符集
TeX排版系統
  • 科克英语Cork encoding
  • LY1英语LY1 encoding
  • OML英语OML encoding
  • OMS英语OMS encoding
  • OT1英语OT1 encoding
其他代碼頁
  • ABICOMP英语ABICOMP character set
  • ASMO 449英语ASMO 449
  • 大五碼
  • APL符號數位編碼英语Digital encoding of APL symbols
    • ISO-IR-68英语ISO-IR-68
  • ARIB STD-B24
  • HZ英语HZ (character encoding)
  • IEC-P27-1英语IEC-P27-1
  • INIS
    • 7位元英语INIS character set
    • INIS-8英语8位元
  • ISO-IR-169英语ISO-IR-169
  • ISO 2033英语ISO 2033
  • KOI
    • -R
    • -RU英语KOI8-RU
    • -U
  • 今昔文字鏡
  • SEASCII英语Stanford Extended ASCII
  • Stanford/ITS英语Stanford/ITS character set
  • TRON英语TRON (encoding)
  • 統合韓文代碼英语Unified Hangul Code
控制字符
相關條目
分类 字元集