Recientemente, alguien preguntó acerca de algorithm for reversing a string in place in C. La mayoría de las soluciones propuestas tenían problemas cuando se trata de cadenas que no son de un solo byte. Entonces, me preguntaba qué podría ser un buen algoritmo para tratar específicamente con cadenas de utf-8.¿Cómo invierto una cadena UTF-8 en su lugar?
Se me ocurrió algo de código, que estoy publicando como respuesta, pero estaría encantado de ver las ideas o sugerencias de otras personas. Preferí usar el código actual, así que elegí C#, ya que parece ser uno de los idiomas más populares en este sitio, pero no me importa si tu código está en otro idioma, siempre que pueda ser razonable. entendido por cualquiera que esté familiarizado con un lenguaje imperativo. Y, como esto pretende ver cómo un algoritmo de este tipo podría implementarse a bajo nivel (por bajo nivel, me refiero a tratar con bytes), la idea es evitar el uso de bibliotecas para el código central.
Notas:
Estoy interesado en el propio algoritmo, su rendimiento y como no podía ser optimizado (me refiero a la optimización a nivel de algoritmo, no reemplazar i ++ ++ con I y tal, yo soy tampoco está realmente interesado en los puntos de referencia reales).
No me refiero a usarlo realmente en el código de producción o "reinventar la rueda". Esto es solo por curiosidad y como ejercicio.
Estoy usando matrices de bytes C, así que supongo que puedes obtener la longitud de la cadena sin ejecutar la cadena hasta que encuentres una NUL. Es decir, no estoy explicando la complejidad de encontrar la longitud de la cadena. Pero si estás usando C, por ejemplo, puedes factorizarlo usando strlen() antes de llamar al código central.
Editar:
Como Mike F señala, mi código (y el código de otras personas publicado aquí) no está tratando con caracteres compuestos. Algo de información sobre esos here. No estoy familiarizado con el concepto, pero si eso significa que hay "caracteres combinados", es decir, caracteres/puntos de código que solo son válidos en combinación con otros caracteres/puntos de código "base", una tabla de consulta de tales los caracteres se pueden usar para conservar el orden del carácter "global" ("base" + "combinación" de caracteres) al invertir.
Esta es una pregunta divertida, pero para invertir * de manera útil * una cadena Unicode (UTF8 u otra), debe preocuparse de conservar el orden de los caracteres compuestos, así como de hacer malabarear con los bytes. –
Gracias por el aviso. No estaba al tanto de los caracteres compuestos. Buscaré eso primero. –