Inspiré par cette question , puis-je utiliser la iconv
commande pour générer une sortie UTF-16 avec une nomenclature et avec une endianité spécifiée?
La iconv
commande convertit le texte d'un encodage en un autre.
Par exemple:
echo hello | iconv -f ascii -t utf-16
génère une représentation UTF-16 de "hello\n"
.
Les fichiers UTF-16 commencent souvent, mais pas toujours, par une marque d'ordre des octets (BOM), qui est un codage sur 2 octets du caractère Unicode U+FEFF
. Vous pouvez déterminer l'endianité d'un fichier UTF-16 avec BOM en vérifiant si les deux premiers octets sont FE FF
ou FF FE
.
La iconv
commande a plusieurs options pour générer une sortie UTF-16:
$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//
Cette commande:
echo hello | iconv -f ascii -t utf-16be
génère UTF-16 big-endian sans BOM ; il semble supposer que si vous avez spécifié l'endianité, vous n'avez pas besoin de l'indiquer dans la sortie. De même, utf-16le
génère un UTF-16 peu endian sans BOM.
Ce:
echo hello | iconv -f ascii -t utf-16
génère (sur mon système Ubuntu x86) UTF-16 little-endian avec une nomenclature - mais j'ai vu un rapport d'une commande similaire générant UTF-16 big-endian avec une nomenclature, même sur un système little-endian.
Je peux toujours utiliser utf-16be
ou utf-16le
et ajouter la nomenclature manuellement, mais je recherche une solution qui utilise simplement la iconv
commande.
Une autre solution de contournement, si vous savez ce que l'endianité -t utf-16
génère, est:
echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null
Ce que je veux est quelque chose comme à l' utilisation:
iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM
mais iconv
ne supporte pas cela.
ÉDITER :
Une personne ayant accès à un système Mac OSX x86 peut-elle publier un commentaire montrant la sortie (copiée-collée) de la commande suivante?
echo hello | iconv -f ascii -t utf-16 | od -x
iconv
- et je me demande pourquoi-t utf-16
semble ne pas spécifier l'endianité.iconv -f UTF-8 -t UTF-16
, exécutée sur un système little-endian (MacOS), générant du big-endian UTF-16 avec une nomenclature, ce qui semble très étrange.Réponses:
Non , si vous spécifiez l'ordre des octets,
iconv
n'insère pas de nomenclature.C'est du Consortium Unicode
(mon accent)
Je m'attends à
iconv
essayer d'être fidèle à la dernière de ces lignes directrices.Mettre à jour.
Une digression
À mon avis:
Une option pour spécifier une nomenclature serait certainement une fonctionnalité supplémentaire utile pour iconv.
Un fichier UTF-16LE sans nomenclature est utilisable sous Windows, bien qu'avec des efforts supplémentaires parfois. Par exemple, la boîte de dialogue d'ouverture de fichier du Bloc-notes vous permet de sélectionner "Unicode" qui est le nom de Microsoft pour "UTF-16LE" et (sans surprise) semble fonctionner sur des fichiers sans nomenclature.
Je peux ouvrir un fichier de test UTF-16LE (sans nomenclature) ou un fichier de test UTF-8 (sans nomenclature) dans le Bloc-notes Windows (XP) de la manière habituelle, par exemple en double-cliquant sur le nom du fichier dans l'explorateur. Cela me semble utilisable. Je suis conscient que parfois Windows devinera l'encodage de manière incorrecte - Dans ce cas, vous devez indiquer l'encodage au Bloc-notes lors de l'ouverture du fichier. Cet inconvénient signifie que l'inclusion d'une nomenclature est préférable pour les fichiers texte destinés à être utilisés sous Windows.
Si une application spécifique ne fonctionne pas avec autre chose qu'un fichier UTF-16LE avec BOM, alors je conviens qu'un fichier UTF-16LE sans BOM n'est pas utilisable pour cette application spécifique.
Je soupçonne que si vous pouvez tout faire fonctionner avec UTF-8 (sans BOM), c'est la meilleure solution à long terme.
Cependant, la réponse à la question " puis-je utiliser la commande iconv pour générer une sortie UTF-16 avec une nomenclature et avec une endianité spécifiée " est actuellement " Non ".
la source
.txt
- tant que le fichier a une nomenclature.C:\Windows\System32\reg.exe
exporte UTF-16 LE AVEC BOM et ne lira que UTF-16 LE AVEC BOM - ne lira pas UTF-16 LE sans BOM et ne lira pas UTF-16 BE avec BOM - en d'autres termes, il exige la nomenclature lors de la lecture, mais il vaut mieux être le bon! (Heureusement, il lit UTF-8.)