operator library dev clase c++ c++11 locale wchar-t

c++ - library - Relación entre ''x'' y L''x ''y ensanchar('' x '')



pow c++ (1)

Sea x cualquier miembro del conjunto de caracteres fuente básico. ''x'' y L''x'' son miembros del conjunto de caracteres de ejecución básico y del conjunto de caracteres anchos de ejecución básica, respectivamente.

¿Es cierto que los valores integrales de ''x'' y L''x'' deben ser iguales? Parece que el estándar no requiere eso, lo que tiene sentido. Es posible que se pueda utilizar, digamos, EBCDIC como el conjunto de caracteres estrecho y Unicode como el conjunto de caracteres ancho.

¿Es cierto que std::use_facet<std::ctype<wchar_t>>(std::locale()).widen(''x'') debe ser igual a L''x'' en algún (o cualquier otro) locale? En este caso, tiene sentido exigirlo, pero tampoco puedo encontrarlo en la norma. Del mismo modo, ¿es std::use_facet<std::ctype<wchar_t>>(std::locale()).narrow(L''x'') lo mismo que ''x'' ?

Si lo anterior no es cierto, entonces cuál de estos

std::wcout << L''x''; std::wcout << ct.widen(''x'');

debe salir x ? ct es una faceta local apropiada.


Es poco lo que se puede garantizar en la práctica sobre los conjuntos de caracteres anchos, porque los estándares C y C ++ requieren que todos los caracteres anchos puedan representarse con un solo valor de codificación, mientras que el estándar en la programación de Windows es el texto ancho codificado en UTF-16. Originalmente, el texto ancho de Windows era simplemente Unicode de 16 bits original, ahora llamado UCS-2, que todavía se usa en las ventanas de la consola de Windows y que cumple con los requisitos de C y C ++. UTF-16 es una extensión de UCS-2 que usa dos valores de codificación, llamados pares sustitutos, para los caracteres que se encuentran fuera del Plano Multilingüe Básico de Unicode original, también conocido como BMP.

Re

¿Es cierto que los valores integrales de ''x'' y L''x'' deben ser iguales? [Cuando x es un miembro del conjunto de caracteres de la fuente básica de C ++]

El conjunto de caracteres fuente básico es un subconjunto de ASCII, y casi todas las codificaciones de caracteres generales existentes, incluidas en particular las codificaciones de Unicode, son extensiones de ASCII. Hay una excepción, a saber, las codificaciones de caracteres EBCDIC de IBM (hay múltiples variantes). Sin embargo, si aún se usa, entonces está en los mainframes de IBM.

Por lo tanto, en la práctica tienes esa garantía, pero en lo formal no la tienes. Más importante, sin embargo, es irrelevante . Por ejemplo, el conjunto de caracteres fuente básico carece del signo $, que difícilmente puede prescindir de él, es decir, limitarse a uno mismo al conjunto de caracteres fuente básico no es una propuesta práctica.

Re

" ¿Es cierto que std::use_facet<std::ctype<wchar_t>>(std::locale()).widen(''x'') debe ser igual a L''x'' en alguna (o cualquier) locale [When x es un miembro del conjunto de caracteres de la fuente básica de C ++]

Por la misma razón que para los literales, sí en la práctica, no en lo formal (ya que las codificaciones como EBCDIC son compatibles), y esto también es irrelevante para el profesional.

En particular, para la práctica, una consideración más relevante es que Visual C ++ de Microsoft tiene ANSI de Windows (no documentado) como su conjunto de caracteres de ejecución, y UTF-16 como la codificación de caracteres anchos. Por ejemplo, en mi máquina el conjunto de caracteres de ejecución es Windows 1252, también conocido como Windows ANSI Western. Y algunos caracteres, en particular €, tienen códigos de caracteres Unicode totalmente diferentes. Peor aún, podría haber un juego de caracteres estrecho que podría usarse como juego de caracteres de ejecución donde la codificación UTF-16 de algún carácter usaría un par suplente de valores de codificación. Y en ese caso, widen ni siquiera puede representar el resultado; No hay espacio para ello.