Actualmente estoy cuidando de una aplicación que utiliza std::string
y char
para operaciones de cadenas - que está muy bien en Linux , ya que Linux es agnóstico a Unicode (o eso parece, realmente no lo sé, así que por favor corrígeme si estoy contando historias aquí). Este estilo actual conduce naturalmente a este tipo de declaraciones de función/clase:Unicode Portabilidad
std::string doSomethingFunkyWith(const std::string& thisdata)
{
/* .... */
}
Sin embargo, si thisdata
contiene caracteres Unicode, se mostrará erróneamente en las ventanas, ya que std::string
no puede contener caracteres Unicode en Windows.
Así que se me ocurrió este concepto:
namespace MyApplication {
#ifdef UNICODE
typedef std::wstring string_type;
typedef wchar_t char_type;
#else
typedef std::string string_type;
typedef char char_type;
#endif
/* ... */
string_type doSomethingFunkyWith(const string_type& thisdata)
{
/* ... */
}
}
¿Es una buena idea para ir con Unicode para apoyar en las ventanas?
Mi actual cadena de herramientas consiste en gcc/clang en Linux, y wine + MinGW para soporte de Windows (el test cruzado también se realiza a través de wine), si eso es importante.
Creo que es razonable. Creo que este es el enfoque adoptado por muchas bibliotecas, como wxWidgets. – HighCommander4
Sí, esto se hace con muchas bibliotecas, Windows para uno, como usted mencionó. – Marlon
Más exactamente, la mayoría de los programas de Linux manejan Unicode como UTF-8, que es compatible con 'std :: string'. Pero eso significa que 'size()' y 'length()' darán el número de bytes, pero no necesariamente el número de puntos de código o glifos. Dependiendo de lo que esté haciendo con las cuerdas, es posible que no necesite más información. – aschepler