我想將u"an arbitrary unicode string"
拆分爲300字節的塊而不破壞任何字符。這些字符串將被寫入使用unicode_string.encode("utf8")
預計utf8的套接字。我不想毀掉任何角色。我將如何做到這一點?將unicode字符串拆分爲300字節的塊而不破壞字符
回答
UTF-8就是爲此而設計的。
def split_utf8(s, n):
"""Split UTF-8 s into chunks of maximum length n."""
while len(s) > n:
k = n
while (ord(s[k]) & 0xc0) == 0x80:
k -= 1
yield s[:k]
s = s[k:]
yield s
未經測試。但是你找到了一個分裂的地方,然後回溯到一個角色的開始。
但是,如果用戶可能想要查看單個塊,則可能需要在字形羣集邊界上進行拆分。這是非常複雜的,但不是棘手的。例如,在"é"
中,您的可能不想將"e"
和"´"
分開。或者你可能不在乎,只要他們最終再次陷入困境。
如果你可以確保你的字符的utf-8表示只有2字節長,你應該可以安全地將unicode字符串分成150個字符(對大多數歐洲編碼來說應該是這樣)。但是utf-8是可變寬度編碼。因此,可能會將unicode字符串拆分爲單個字符,將每個字符轉換爲utf-8並填充緩衝區,直至達到最大塊大小......如果高吞吐量是必須的,則這可能效率低下並且存在問題...
將會有更多的歐洲編碼。中國人和日本人肯定會代表。高吞吐量不是必需的。我希望有一個更漂亮的解決方案。 – runfalk 2011-05-18 11:02:26
那麼,utf-8轉換的字符長度最多爲4個字節。所以75個字符乘4的垃圾使得300個字節處於非常安全的一邊。 – 2011-05-18 11:03:55
UTF-8具有特殊的性質,所有的連續字符0x80
–(開始位10)。所以只要確保你在一個之前不分裂。
線沿線的東西:
def split_utf8(s, n):
if len(s) <= n:
return s, None
while ord(s[n]) >= 0x80 and ord(s[n]) < 0xc0:
n -= 1
return s[0:n], s[n:]
應該做的伎倆。
'如果len(s <= n)'??? – 2011-05-18 11:39:34
@John Fixxored。 – badp 2011-05-18 11:44:17
utf-32
使用Unicode編碼:
>>> u_32 = u'Юникод'.encode('utf-32')
>>> u_32
'\xff\xfe\x00\x00.\x04\x00\x00=\x04\x00\x008\x04\x00\x00:\x04\x00\x00>\x04\x00\x
004\x04\x00\x00'
>>> len(u_32)
28
>>> len(u_32)%4
0
>>>
編碼可以發送任何大小的塊之後,而不破壞字符
(大小必須是4個的倍數字節)這是不可能的,因爲服務器需要UTF-8 – runfalk 2011-05-18 13:31:53
經過測試。
def split_utf8(s , n):
assert n >= 4
start = 0
lens = len(s)
while start < lens:
if lens - start <= n:
yield s[start:]
return # StopIteration
end = start + n
while '\x80' <= s[end] <= '\xBF':
end -= 1
assert end > start
yield s[start:end]
start = end
- 1. 將字符串拆分爲「'」而不是「?」 「
- 2. 將字符串拆分爲字符串
- 3. 將字符串拆分爲字符串
- 4. 如何將unicode字符串拆分爲多個字符?
- 5. 如何將字符串拆分爲行,而不會破壞單詞?
- 6. 拆分字符串,unicode,unicode,python中的字符串
- 7. Unicode字符破壞文本
- 8. 將字符串轉換爲集合而不拆分字符
- 9. 將lua字符串拆分爲字符
- 10. php將字符串拆分爲字符
- 11. PatternSyntaxException將字符串拆分爲「*」字符
- 12. 將字符串拆分爲塊。
- 13. 在字符串上拆分字符串而不是字符
- 14. PHP:將多字節字符串(字)拆分爲不同的字符
- 15. C#拆分字符串 - 將字符串拆分爲數組
- 16. 將字符串拆分爲「。」
- 17. 將字符串拆分爲「|」
- 18. 按字符數拆分字符串而不拆分單詞
- 19. 將unicode字符串轉換爲字節字符串
- 20. 字符串操作:將此字符串拆分爲 - 字符?
- 21. 如何在C#中將Unicode字符串拆分爲多個Unicode字符?
- 22. 將字符串N拆分爲4個不同的字符串
- 23. 將很長的字符串拆分爲字符重疊的較小字符塊
- 24. 使用拆分將字符串拆分爲2個字符組?
- 25. 將字符串拆分爲字典
- 26. 將字符串生成器拆分爲字符串字符串特定字符
- 27. 如何將字符串拆分爲字母字符串和數字字符串?
- 28. 拆分字節串上一個字節串(而不是Word8或字符)
- 29. 將一個字符串拆分爲較小的字符串而不是數組
- 30. Elisp拆分字符串函數來拆分字符串。字符
我測試了這個,它似乎工作。雖然最終用戶會看到這個塊,但我覺得這個解決方案足夠好。在一些快速閱讀的字形集羣邊界似乎非常需要實施。我現在不需要它。 '(ord(s [k])&0xc0)== 0x80'與「\ x80」相同<= s [k] <=「\ xBF」'?我確實發現這個整齊製作的 – runfalk 2011-05-18 14:08:21
是的,它們是相同的。我有點習慣於用C編寫UTF-8處理代碼,這解釋了風格。使用你最喜歡的風格。 – 2011-05-18 19:58:02