Quiero dividir u"an arbitrary unicode string"
en trozos de, por ejemplo, 300 bytes sin destruir ningún carácter. Las cadenas se escribirán en un socket que espera utf8 usando unicode_string.encode("utf8")
. No quiero destruir ningún personaje. ¿Cómo haría esto?Dividir cadena unicode en trozos de 300 bytes sin destruir los caracteres
Respuesta
UTF-8 está diseñado para esto.
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
No probado. Pero encuentras un lugar para dividir, luego retrocedes hasta llegar al comienzo de un personaje.
Sin embargo, si un usuario alguna vez desea ver un fragmento individual, es posible que desee dividir los límites del clúster de grafemas en su lugar. Esto es significativamente más complicado, pero no difícil de resolver. Por ejemplo, en "é"
, podría no desea dividir el "e"
y el "´"
. O puede que no te importe, siempre y cuando se unan nuevamente al final.
Si puede asegurarse de que la representación del utf-8 de sus caracteres es de solo 2 bytes de longitud, debería separar la cadena unicode en segmentos de 150 caracteres (esto debería ser cierto para la mayoría de las codificaciones europeas). Pero utf-8 es una codificación de ancho variable. Por lo tanto, podría dividir la cadena Unicode en caracteres únicos, convertir cada char a utf-8 y llenar el búfer hasta que alcance el tamaño máximo de fragmento ... esto podría ser ineficiente y un problema si el alto rendimiento es una necesidad ...
Habrá más codificaciones europeas. Tanto chinos como japoneses definitivamente estarán representados. Alto rendimiento no es requerido. Sin embargo, esperaba que hubiera una solución más bonita. – runfalk
Bueno, los caracteres convertidos en utf-8 son como máximo de 4 bytes de longitud. Así que los juncos de 75 caracteres por 4 hacen 300 bytes para estar en el lado más seguro. –
UTF-8 tiene una propiedad especial de que todos los caracteres de continuación son 0x80
– 0xBF
(comienza con los bits 10). Así que solo asegúrate de no dividir justo antes de uno.
Algo a lo largo de las líneas de:
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:]
debe hacer el truco.
'si len (s <= n)' ??? –
@John Fixxored. – badp
Uso codificación Unicode que por diseño tienen una longitud fija de cada personaje, por ejemplo utf-32
:
>>> 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
>>>
Después de la codificación puede enviar trozo de cualquier tamaño (tamaño debe ser múltiplo de 4 bytes) sin destruir caracteres
Esto no es posible ya que el servidor espera UTF-8 – runfalk
Probado.
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. ¿Cómo puedo dividir una cadena en trozos de dos caracteres cada uno en Perl?
- 2. dividir cadena PHP en trozos de longitud variable
- 3. caracteres Unicode cadena
- 4. Caracteres Unicode en cadena - iphone
- 5. conseguir bytes de cadena Unicode en Python
- 6. Convertir cadena de unicode a cadena de bytes
- 7. Devolviendo los primeros N caracteres de una cadena Unicode
- 8. Cadena de Ruby # caracteres gsub, unicode y sin palabra
- 9. Dividir un vector en trozos en R
- 10. Python: maneja bytes unicode rotos al analizar cadena JSON
- 11. T-SQL Obtenga bytes de VARCHAR sin convertir a UNICODE
- 12. cadena de bytes frente a cadena unicode. Python
- 13. Obtenga la cantidad de bytes necesarios para una cadena Unicode
- 14. Caracteres Unicode de Base64ing
- 15. Dividir la matriz JSON de 95mb en trozos más pequeños?
- 16. Cómo dividir una cadena por varios caracteres en MSBuild 4?
- 17. Caracteres Unicode del código de caracteres en javascript para los códigos de caracteres> 0xFFFF
- 18. Confusión sobre Unicode y varios bytes artículos
- 19. PHP: dividir cadena multibyte (palabra) en caracteres separados
- 20. Reemplazar caracteres no ASCII de una cadena Unicode en Python
- 21. dividir cadena en una serie de caracteres diferentes
- 22. dividir una cadena en caracteres individuales en SQL Server 2005
- 23. cadena Unicode en XML
- 24. ¿Cómo puedo detectar caracteres Unicode en una cadena de Java?
- 25. ¿Cuál es la mejor manera de dividir una cadena en una matriz de caracteres Unicode en PHP?
- 26. dividir ARGB en valores de bytes
- 27. Diferencia entre cadena binaria, cadena de bytes, cadena Unicode y una cadena ordinaria (str)
- 28. cómo dividir en grupo de caracteres?
- 29. ¿Cómo dividir una cadena con caracteres en blanco al principio?
- 30. Lista de caracteres alfabéticos Unicode
Probé esto y parece funcionar. Aunque los usuarios finales verán los trozos, considero que esta solución es lo suficientemente buena. Tras algunas lecturas rápidas, los límites del grupo de grafemas parecían muy difíciles de implementar. No lo necesito en este momento. Es '(ord (s [k]) & 0xc0) == 0x80' lo mismo que' "\ x80" <= s [k] <= "\ xBF" '? Sí encontré esto cuidadosamente elaborado – runfalk
Sí, son equivalentes. Estoy algo acostumbrado a escribir el código de manejo UTF-8 en C, lo que explica el estilo. Usa el estilo que te parezca mejor. –