Existe uma maneira padrão para fazer um fopen com um caminho de arquivo string unicode?

StackOverflow https://stackoverflow.com/questions/396567

  •  29-08-2019
  •  | 
  •  

Pergunta

Existe uma maneira padrão para fazer um fopen com um caminho de arquivo string unicode?

Foi útil?

Solução

Em * nix, você simplesmente usar o fopen standard (ver mais informações em resposta a partir TokeMacGuy, ou neste fórum ) No Windows, você pode usar _wfopen, e, em seguida, passar uma seqüência de caracteres Unicode (para mais informações, consulte MSDN ).

Como não há maneira comum real, eu iria quebrar essa chamada em uma macro, juntamente com todas as outras funções dependentes do sistema.

Outras dicas

Não, não há nenhuma maneira padrão. Existem algumas diferenças entre os sistemas operacionais. Veja como sistemas operacionais diferentes nomes identificador não-ASCII.

Linux

No Linux, um nome de arquivo é simplesmente uma string binária. A convenção na maioria das distribuições modernas é usar UTF-8 para nomes de arquivos não-ASCII. Mas, no início, era comum a nomes de arquivos codificar como ISO-8559-1. É basicamente a cada aplicação de escolher uma codificação, então você pode até ter diferentes codificações usadas no mesmo sistema de arquivos. A variável de ambiente LANG pode lhe dar uma dica que a codificação preferida é. Mas estes dias, você provavelmente pode assumir UTF-8 em todos os lugares.

Este não é sem problemas, embora, porque um nome de arquivo que contém uma seqüência de UTF-8 inválido é perfeitamente válido na maioria dos sistemas de arquivos Linux. Como você especificar um nome de arquivo como se você só suportam UTF-8? Idealmente, você deve suportar ambos os nomes de arquivos UTF-8 e binários.

OS X

O sistema de arquivos HFS no OS X usa Unicode (UTF-16) nomes de arquivos internamente. Mais funções de biblioteca como fopen aceitar C (e POSIX) UTF-8 cordas (uma vez que eles são de 8 bits compatível) e convertê-los internamente.

Windows

A API do Windows usa UTF-16 para nomes de arquivos, mas fopen só suporta ASCII. Muitas funções de biblioteca C tem um equivalente não-padrão que aceita UTF-16 (wchar_t no Windows). Por exemplo, _wfopen vez de fopen.

Esta é uma questão de seu local atual. no meu sistema, que é unicode habilitado, caminhos de arquivo estará em unicode. Eu sou capaz de detectar isso por meio do comando locale:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"

A codificação de caminhos de arquivo é o sistema normalmente conjunto de largura, por isso, se o seu caminho de arquivo não está na localidade do sistema, você precisa convertê-lo, talvez por meio do iconv biblioteca.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top