[Python] 作 idna 編碼時出現 label empty or too long 錯誤
今天我們的 python 程式在將一個 domain name 編碼 (encode) 成 idna 時,
出現了奇怪的 label empty or too long 錯誤:
>>> ("www." + "a"*64 + ".com").encode("idna") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/idna.py", line 164, in encode result.append(ToASCII(label)) File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/idna.py", line 73, in ToASCII raise UnicodeError("label empty or too long") UnicodeError: label empty or too long
查了一下,原來是 domain name 裡面每個用 “.” 隔開的叫 label,
而每個 label 必須符合 DNS name 最長 63 字元的限制,
因此像 www 和 com 沒有問題,但中間的 64 個 a 就爆了~
對照一下 python 的 idna.py 原始碼,也的確是檢查 label 的長度如果不是 1~63 的話,
就會吐出 label empty or too long 的錯誤:
if 0 < len(label) < 64: return label raise UnicodeError("label empty or too long")
參考資料:
stackoverflow: label empty or too long – python urllib2
wikipedia: Internationalized domain name
(本頁面已被瀏覽過 2,160 次)
2 thoughts on “[Python] 作 idna 編碼時出現 label empty or too long 錯誤”
请问怎样消除这个错误?
如果這個 domain name 是外部給予的,
可能無法避免出現錯誤,
畢竟沒辦法限制外部只給予正確的格式。
我們的做法就是 catch exception 再 log 記錄起來~