2011-02-17 19 views
5

He usado algunos buenos lenguajes de programación a lo largo de los años y soy un lingüista de sillón y colaborador de Wiktionary. He estado haciendo algunas de mis propias herramientas para buscar Wiktionary desde la línea de comandos, pero me encontré con un problema sorprendente.¿Algún idioma hace Unicode y multiplataforma correctamente y completamente?

Neither Perl nor Python can output Unicode to the console natively under both *nix and Windows (aunque hay varias soluciones). La razón principal es que los sistemas operativos * nix como su Unicode en UTF-8 y Windows le gusta su Unicode en UTF-16. Pero también parece que Windows makes it very difficult to use wide characters with the console even though both the console and wprintf are wide character native.

Así que la pregunta es, ¿la situación es mejor si miro más allá de estos idiomas en Java, C#, Scala, etc. ¿O hay algún lenguaje de script que comenzó en Windows y luego fue portado a * nix?

Aquí es un poco de pseudocódigo ideales:

function main() 
{ 
    print(L"hello, 世界"); 
} 
+3

La respuesta final es que cualquier lenguaje necesitaría llamar 'WriteConsoleW' en lugar de' WriteFile', rompiendo una barrera de abstracción ... así que no es realmente un problema de lenguaje, sino de diseño de biblioteca. – Mehrdad

+0

Podría estar inclinado a investigar sobre Java, ya que originalmente estaba destinado a la independencia de la plataforma y el manejo de cadenas se construyó alrededor de unicdode. Los archivos de origen son unicode, por lo que su código de psuedo ideal podría compilarse con un poco de ajuste. – Jimmy

+0

@Mehdrad: o Microsoft posiblemente puede arreglar wprintf et al para que pueda imprimir cadenas de caracteres anchos directamente sin conversión, a menos que esto sea un error en la especificación de las configuraciones regionales wprintf o POSIX de C o algo así? Alternativamente, los lenguajes de programación podrían agregar una capa de abstracción entre su función de impresión y WriteFile/WriteConsoleW o cualquier API de la que dependan. – hippietrail

Respuesta

0

yo sepa casi todos los lenguajes de script se inició en el mundo Unix y luego fueron portados a Windows. No conozco ningún ejemplo de un lenguaje (de scripting) que comenzó en Windows ... Un lenguaje de scripting que parece funcionar muy bien con Unicode en estos días es Ruby.

+0

El único lenguaje de scripting que pude pensar que comenzó en Windows es Windows PowerShell, pero a diferencia de Perl y Python parece mucho más dirigido a scripts que programas, y es muy arcano (-: – hippietrail

+1

Aunque parece tener algunas funciones ingeniosas (como la tubería de objetos) ... pero está * solo * disponible en Windows, por lo que no cuenta :-) – DarkDust

+0

Actualmente hay un PowerShell para * nix, se llama Pash pero no es un tipo de PowerShell que no he probado it: http://pash.sourceforge.net/ – hippietrail

-1

Quizás esta es una de las soluciones que insinuado, pero: Puede chcp 65001 en una 'ventana DOS' con una fuente sin datos de trama seleccionar y ver UTF-8 salidas de scripts (o programas) que se ejecutan sin cambios bajo Unix o Windows. El precio a pagar es que los archivos .bat/.cmd no se ejecutarán.

+2

"chcp 65001" establece la codificación "ANSI" en UTF-8 para que pueda usar WriteConsoleA con una cadena UTF-8 y WriteConsoleW con una cadena UTF-16. En la práctica, parece ser poco compatible. Causa que Python se cuelgue y Perl genere artefactos que parecen derivarse de la diferencia en la longitud del carácter y la longitud del byte de las cadenas UTF-8. – hippietrail

+0

He investigado esto más a fondo y hay un error en la API 'WriteFile()' de Windows donde devuelve el número de caracteres en la página de códigos 65001 en lugar del número documentado de bytes. Esta es la causa de que 'chcp 65001' no funcione en Perl, PHP y Ruby en Windows. Python sufre de su propio error por separado. – hippietrail

2

¿Algún idioma hace Unicode y multiplataforma correctamente y completamente?

C# admite Unicode muy extensamente. Su biblioteca estándar (.NET Framework) también tiene un excelente soporte para Unicode. La plataforma cruzada es razonable, pero no perfecta: se logra a través de Mono y en plataformas móviles a través de Xamarin.

Los programas de línea de comandos son bastante portátiles pero pueden ser atornillados por reliquias antiguas, como terminales SSH que no se han actualizado durante una década o más.

Aquí es un poco de pseudocódigo ideales:

C# pone muy cerca:

using System; 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.OutputEncoding = System.Text.Encoding.UTF8; 
     Console.WriteLine("tést, тест, τεστ, ←↑→↓∏∑√∞①②③④, Bài viết chọn lọc"); 
    } 
} 

Captura de pantalla de la salida (uso Consolas u otra fuente que tiene todos los caracteres anteriores):

proof

Por supuesto C# no es un lenguaje de scripting; es bastante diferente en su enfoque a casi todo.