Saltar al contenido

C++20 con u8, char8_t y std::string

Este grupo de redactores ha estado mucho tiempo investigando la respuesta a tu búsqueda, te regalamos la soluciones así que nuestro deseo es que te resulte de gran apoyo.

Solución:

Además de la respuesta de @lubgr, el papel de corrección de compatibilidad con versiones anteriores de char8_t (P1423) analiza varias formas de cómo hacer std::string con char8_t matrices de caracteres.

Básicamente, la idea es que puedas lanzar el u8 carbonizarse array en un carácter “normal” array para obtener el mismo comportamiento que C++17 y anteriores, solo tiene que ser un poco más explícito. El documento analiza varias maneras de hacer esto.

El método más simple (pero no completamente cero gastos generales, a menos que agregue más sobrecargas) que se ajuste a su caso de uso es probablemente el último, es decir, introducir funciones de conversión explícitas:

std::string from_u8string(const std::string &s) 
  return s;

std::string from_u8string(std::string &&s) 
  return std::move(s);

#if defined(__cpp_lib_char8_t)
std::string from_u8string(const std::u8string &s) 
  return std::string(s.begin(), s.end());

#endif

¿Debería crear un nuevo utf8string?

No, ya está ahí. P0482 no solo propone char8_tsino también una nueva especialización de std::basic_string por char8_t tipos de caracteres nombrados std::u8string. Entonces esto ya compila con clang y libc++ del maletero:

const std::u8string str = u8"●";

El hecho de que std::string construcción de un u8-Las rupturas literales son lamentables. De la propuesta:

Esta propuesta no especifica ninguna función de compatibilidad con versiones anteriores que no sea conservar las interfaces que desaprueba. El autor cree que tales características son necesarias, pero que un solo conjunto de tales características comprometería innecesariamente los objetivos de esta propuesta. Más bien, la expectativa es que las implementaciones proporcionen opciones para habilitar funciones de compatibilidad más detalladas.

Pero supongo que la mayor parte de la inicialización como la anterior debería ser grep-capaz o estar sujeto a alguna automática clang correcciones de herramientas.

¿Debería crear un nuevo utf8string?

No, C++20 agrega std::u8string. Sin embargo, recomendaría usar std::string en cambio porque char8_t tiene un soporte deficiente en el estándar y no es compatible con ninguna API del sistema (y probablemente nunca lo será debido a razones de compatibilidad). En la mayoría de las plataformas normal char las cadenas ya son UTF-8 y en Windows con MSVC puede compilar con /utf-8 que le brindará compatibilidad con Unicode portátil en los principales sistemas operativos.

Por ejemplo, ni siquiera puede escribir un programa Hello World usando cadenas u8 en C++20 (https://godbolt.org/z/E6rvj5):

std::cout << u8"Hello, world!n"; // won't compile in C++20

En Windows con MSVC y versiones anteriores a C++20, la situación es aún peor porque las cadenas u8 pueden corromperse silenciosamente. Por ejemplo:

std::cout << "Привет, мир!n";

producirá UTF-8 válido que puede o no mostrarse en la consola dependiendo de su página de códigos actual mientras

std::cout << u8"Привет, мир!n";

casi definitivamente le dará un resultado no válido como ╨а╤Я╨б╨В╨а╤С╨а╨Ж╨а┬╡╨бтАЪ, ╨а╤Ш╨а╤С╨б╨В!.

Te mostramos comentarios y valoraciones

Te invitamos a añadir valor a nuestro contenido informacional asistiendo con tu veteranía en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *