Pregunta

Todavía estoy tratando de decidir si mi proyecto (hogar) debería usar UTF-8 cadenas (implementadas en términos de std::string con funciones adicionales específicas de UTF-8 cuando sea necesario) o alguna cadena de 16 bits (implementada como std::wstring).El proyecto es un lenguaje y entorno de programación (como VB, es una combinación de ambos).

Hay algunos deseos/limitaciones:

  • Sería genial si pudiera ejecutarse en hardware limitado, como computadoras con memoria limitada.
  • Quiero que el código se ejecute en Windows, Mac y (si los recursos lo permiten) Linux.
  • estaré usando wxWidgets como mi capa GUI, pero quiero que el código que interactúa con ese kit de herramientas esté confinado en una esquina del código base (tendré ejecutables que no sean GUI).
  • Me gustaría evitar trabajar con dos tipos diferentes de cadenas cuando trabajo con texto visible para el usuario y con los datos de la aplicación.

Actualmente, estoy trabajando con std::string, con la intención de utilizar funciones de manipulación UTF-8 solo cuando sea necesario.Requiere menos memoria y, de todos modos, parece ser la dirección en la que van muchas aplicaciones.

Si recomienda una codificación de 16 bits, cuál: UTF-16? UCS-2?¿Otro?

¿Fue útil?

Solución

Recomendaría UTF-16 para cualquier tipo de manipulación de datos y UI.La API de Mac OS X y Win32 usa UTF-16, lo mismo para wxWidgets, Qt, ICU, Xerces y otros.UTF-8 podría ser mejor para el intercambio y almacenamiento de datos.Ver http://unicode.org/notes/tn12/.

Pero elijas lo que elijas, definitivamente recomendaría no std::string con UTF-8 "solo cuando sea necesario".

Vaya hasta el final con UTF-16 o UTF-8, pero no mezcle y combine, eso es buscar problemas.

Otros consejos

UTF-16 sigue siendo una codificación de caracteres de longitud variable (hay más de 2^16 puntos de código Unicode), por lo que no se pueden realizar operaciones de indexación de cadenas O(1).Si haces muchas cosas de ese tipo, no guardarás nada en velocidad en UTF-8.Por otro lado, si su texto incluye muchos puntos de código en el rango 256-65535, UTF-16 puede representar una mejora sustancial en tamaño.UCS-2 es una variación de UTF-16 que es longitud fija, a costa de prohibir cualquier punto de código mayor que 2^16.

Sin saber más sobre sus requisitos, personalmente elegiría UTF-8.Es el más fácil de abordar por todas las razones que otros ya han enumerado.

Para ser honesto, nunca he encontrado ninguna razón para usar otra cosa que no sea UTF-8.

Si decide utilizar la codificación UTF-8, consulte esta biblioteca: http://utfcpp.sourceforge.net/

Puede que te haga la vida mucho más fácil.

De hecho, escribí una aplicación ampliamente utilizada (más de 5 millones de usuarios), por lo que cada kilobyte utilizado se suma, literalmente.A pesar de eso, me quedé con wxString.Lo configuré para que se derive de std::wstring, para poder pasarlos a funciones que esperan una wstring const&.

Tenga en cuenta que std::wstring es Unicode nativo en Mac (no se necesita UTF-16 para caracteres superiores a U+10000) y, por lo tanto, utiliza 4 bytes/wchar_t.La gran ventaja de esto es que i++ te da el siguiente carácter, siempre.En Win32 esto es cierto sólo en el 99,9% de los casos.Como compañero programador, comprenderá lo poco que es el 99,9%.

Pero si no está convencido, escriba la función en mayúsculas std::string[UTF-8] y std::wstring.Esas 2 funciones te dirán en qué dirección está la locura.

Su formato en disco es otra cuestión.Para portabilidad, debería ser UTF-8.No hay preocupaciones sobre el endianismo en UTF-8, ni una discusión sobre el ancho (2/4).Esta puede ser la razón por la que muchos programas parecen utilizar UTF-8.

En una nota ligeramente ajena, lea sobre las comparaciones y normalización de cadenas Unicode.O terminará con el mismo error que .NET, donde puede tener dos variables föö y föö que se diferencian sólo en la normalización (invisible).

MicroATX es prácticamente un formato de placa base de PC estándar, con una capacidad máxima de 4 a 8 GB de RAM.Si estás hablando de picoATX, tal vez estés limitado a 1 o 2 GB de RAM.Incluso entonces, eso es suficiente para un entorno de desarrollo.Todavía me quedaría con UTF-8 por las razones mencionadas anteriormente, pero la memoria no debería ser tu preocupación.

Por lo que he leído, es mejor utilizar una codificación de 16 bits internamente a menos que tengas poca memoria.Se adapta a casi todas las lenguas vivas en un solo carácter.

Yo también miraría UCI.Si no va a utilizar ciertas características STL de las cadenas, podría ser mejor para usted usar los tipos de cadenas ICU.

¿Has considerado usar wxStrings?Si no recuerdo mal, pueden realizar conversiones utf-8 <-> Unicode y lo hará un poco más fácil cuando tengas que pasar cadenas hacia y desde la interfaz de usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top