2010-04-02 20 views
2

我正在尋找一種簡單高效的方式來存儲ASCII-7中的UTF-8字符串。憑藉高效的我指的是以下幾點:ASCII編碼的有效方法UTF-8

  • 所有輸入ASCII字母數字字符應保持相同的ASCII字母數字字符輸出
  • 生成的字符串應該是儘可能短
  • 操作必須可逆式沒有任何數據丟失
  • 所得ASCII字符串應不區分大小寫
  • 應該有對輸入長度
  • 沒有限制整個UTF-8範圍應當allowe d

我的第一個想法是使用Punycode(IDNA),因爲它符合前四個要求,但它在最後兩個失敗。

任何人都可以推薦一種替代編碼方案嗎?更好的是,如果有一些代碼可供查看。

+0

你是什麼意思通過「輸入中的所有ASCII字符都應該在輸出中保留ASCII字符」?你在問什麼是7位編碼? – 2010-04-02 15:16:09

+0

我更新了第一點,以便更清楚。我也忘了提及,我希望有大小寫不敏感的輸出,似乎排除UTF-7。 – 2010-04-02 15:38:46

+0

當你說「生成的ASCII字符串應該不區分大小寫」你是什麼意思?字符串只是字符串,它們不區分大小寫或不敏感。你的意思是它應該全部小寫嗎?全部大寫? – 2010-04-02 16:03:32

回答

4

UTF-7,或者,稍不透明但更廣泛的quoted-printable

輸入所有ASCII字符應留ASCII字符輸出

(顯然不是完全可能的,因爲你需要至少一個字符作爲一種逃避。)

+0

您正在閱讀的要求是,輸入中的ASCII字符在輸出中保持爲*相同的* ASCII字符。這可能是他的意圖(在這種情況下,你顯然是正確的),但這不是他實際上所說的 - 並且符合所述要求的編碼當然是可能的。 – 2010-04-02 15:16:54

+0

heh。是的,我的意思是ASCII字符應該保持相同的字符。 UTF-7看起來很不錯。感謝提示。 – 2010-04-02 15:28:47

+0

@Andreas Gohr - UTF-7不保留修改後的ASCII範圍。 – 2010-04-02 15:37:50

2

由於ASCII涵蓋了全部的7位值,所以保留所有ASCII字符的編碼方案長度爲7位,並且編碼完整的Unicode範圍是不可能的。

編輯補充:

我想我明白你的要求了。您正在尋找一種方法來編碼UTF-8字符串的七位代碼,其中,如果該編碼的字符串被解釋爲ASCII文本,則字母字符的情況可以任意修改,但解碼後的字符串將會與原始字節相同。

如果是這樣的話,那麼你最好的選擇可能就是將原始的二進制表示編碼爲一串十六進制數字。我知道你正在尋找更緊湊的表示形式,但考慮到系統的其他限制,這是一個非常高的順序,除非設計了一些自定義編碼。

由於十六進制表示法可以對任意二進制值進行編碼,因此可以在採用十六進制值之前壓縮字符串來縮小字符串。

0

URL編碼或數字字符引用是兩種可能的選項。

0

它取決於字符串中字符的分佈。

Quoted-printable對於大多數ASCII字符串是很好的,因爲除了'='和控制字符之外沒有開銷。但是,非ASCII字符每個都需要6-12個字節,所以如果您有很多這些字符,則需要考慮使用UTF-7或Base64。

1

如果你談論的是非標準方案 - MECE

0

的Punycode用於IDNA,但您可以使用它通過它施加的限制外

本身的Punycode不會失敗的最後2個要求:

>>> import sys 
>>> _ = ("\U0010FFFF"*10000).encode("punycode") 
>>> all(chr(c).encode("punycode") for c in range(sys.maxunicode)) 
True 

(對於IDNA,蟒蛇用品另一個同名編碼)

很明顯,如果你不姓準備輸入,編碼的字符串不是嚴格不區分大小寫的......但是如果你只提供小寫字母(或者如果你不關心解碼的情況)你應該很好去