Utf 8 decode linux

Как преобразовать файлы в кодировку UTF-8 в Linux

В этом руководстве мы опишем, что такое кодировка символов, и рассмотрим несколько примеров преобразования файлов из одной кодировки символов в другую с помощью инструмента командной строки. Затем, наконец, мы рассмотрим, как преобразовать несколько файлов из любого набора символов (charset) в кодировку UTF-8 в Linux.

Как вы, возможно, уже имеете в виду, компьютер не понимает и не хранит буквы, цифры или что-либо еще, что мы, люди, можем воспринимать, кроме битов. Бит имеет только два возможных значения: 0 или 1 , true или false , да или нет . Любая другая вещь, такая как буквы, цифры, изображения, должна быть представлена в битах для обработки компьютером.

Проще говоря, кодировка символов — это способ сообщить компьютеру, как интерпретировать необработанные нули и единицы в фактические символы, где символ представлен набором чисел. Когда мы набираем текст в файле, слова и предложения, которые мы формируем, состоят из разных символов, а символы организованы в кодировку.

Существуют различные схемы кодирования, такие как ASCII, ANSI, Unicode и другие. Ниже приведен пример кодировки ASCII.

Character bits A 01000001 B 01000010

В Linux инструмент командной строки icon используется для преобразования текста из одной формы кодировки в другую.

Вы можете проверить кодировку файла с помощью команды file, используя флаг -i или —mime , который разрешает печать типа mime. строка, как в примерах ниже:

$ file -i Car.java $ file -i CarDriver.java

Синтаксис использования icon следующий:

$ iconv option $ iconv options -f from-encoding -t to-encoding inputfile(s) -o outputfile

Где -f или —from-code означает входную кодировку, а -t или —to-encoding указывает выходное кодирование.

Чтобы получить список всех известных кодированных наборов символов, выполните следующую команду:

Преобразование файлов из кодировки UTF-8 в кодировку ASCII

Далее мы узнаем, как преобразовать одну схему кодирования в другую. Приведенная ниже команда преобразует кодировку ISO-8859-1 в UTF-8.

Рассмотрим файл с именем input.file , который содержит символы:

Начнем с проверки кодировки символов в файле, а затем просмотрим содержимое файла. Мы можем преобразовать все символы в кодировку ASCII.

После выполнения команды icon мы проверяем содержимое выходного файла и новую кодировку символов, как показано ниже.

$ file -i input.file $ cat input.file $ iconv -f ISO-8859-1 -t UTF-8//TRANSLIT input.file -o out.file $ cat out.file $ file -i out.file

Примечание. В случае добавления строки //IGNORE в to-encoding символы, которые не могут быть преобразованы, и ошибка отображается после преобразования.

Опять же, предположим, что строка //TRANSLIT добавлена в to-encoding, как в приведенном выше примере (ASCII//TRANSLIT), преобразуемые символы транслитерируются по мере необходимости и, если возможно, . Это означает, что в случае, если символ не может быть представлен в целевом наборе символов, он может быть аппроксимирован одним или несколькими похожими символами.

Читайте также:  Очистка терминала терминале linux

Следовательно, любой символ, который не может быть транслитерирован и не входит в целевой набор символов, в выводе заменяется знаком вопроса (?) .

Преобразование нескольких файлов в кодировку UTF-8

Возвращаясь к нашей основной теме, чтобы преобразовать несколько или все файлы в каталоге в кодировку UTF-8, вы можете написать небольшой сценарий оболочки с именем encoding.sh следующим образом:

#!/bin/bash #enter input encoding here FROM_ENCODING="value_here" #output encoding(UTF-8) TO_ENCODING="UTF-8" #convert CONVERT=" iconv -f $FROM_ENCODING -t $TO_ENCODING" #loop to convert multiple files for file in *.txt; do $CONVERT "$file" -o "$.utf8.converted" done exit 0

Сохраните файл, затем сделайте скрипт исполняемым. Запустите его из каталога, где находятся ваши файлы ( *.txt ).

$ chmod +x encoding.sh $ ./encoding.sh

Важно: вы также можете использовать этот скрипт для общего преобразования нескольких файлов из одной заданной кодировки в другую, просто поэкспериментируйте со значениями FROM_ENCODING и переменную TO_ENCODING , не забывая имя выходного файла \&#36 .utf8.converted\ .

Для получения дополнительной информации просмотрите справочную страницу icon.

Подводя итог этому руководству, понимание кодировки и того, как преобразовать одну схему кодировки символов в другую, является необходимым знанием для каждого пользователя компьютера, особенно для программистов, когда дело доходит до работы с текстом.

Наконец, вы можете связаться с нами, используя раздел комментариев ниже для любых вопросов или отзывов.

Источник

How can I decode a file name using command line?

Is there any command line tool that decodes the files names into their UTF-8 values:

@JuliePelletier looks like the question is perfectly clear: how to decode a filename into UTF-8 octets

For € for instance, would you like to see 0x20ac (the Unicode code point of that EURO character) or 0xe2 0x82 0xac (the 3 bytes of the UTF-8 encoding of that EURO character)?

The target of the question is to get, starting from a file name, the UTF-8 encoded values. So in the case of the € symbol, I expect: 0xe2 0x82 0xac. The solution proposed by Stéphane, based on iconv, tells you if a file name is well encoded or not

4 Answers 4

The standard (POSIX/Unix) command to get the byte values as hex numbers is od .

file=foo.mp3 printf %s "$file" | od -An -vtx1 

Which gives an output similar to:

$file above contains an arbitrary array of (non-NUL for shells other than zsh ) bytes. The character encoding doesn’t enter in consideration.

If you want $file to contain an array of characters (so in the locale’s encoding) and you want to get the Unicode code points for each of them as hexadecimal numbers, on a Little-Endian system, you could do:

printf %s "$file" | iconv -t UTF-32LE | od -An -vtx4 
printf %s "$file" | recode ..dump 
printf %s "$file" | uconv -x hex/unicode printf %s "$file" | uconv -x '([:Any:])>&hex/unicode($1)\n' 

If you wanted the byte values as hex numbers of the UTF-8 encoding of those characters:

printf %s "$file" | iconv -t UTF-8 | od -An -vtx1 

For something like foo.mp3 that contains only ASCII characters, they’re all going to be equivalent.

Читайте также:  Linux get file attributes

I tried to use UTF-32LE but it seems not supported:»iconv: conversion to `UTF-32LE’ is not supported». It’s strange because «iconv —list | grep UTF» returns both UTF-32LE and UTF-32BE. Anyway, specifying UTF-8 works fine

I’m a bit «out of context», but about the choices of unicode out there, I want to point people reading this answer to a good read : utf8everywhere.org . spread the word! ^^

$ perl -CA -le 'print join " ", map < sprintf "0x%X", $_ >unpack "U*" for @ARGV' \ foo.mp3 bar.mp3 cường 0x66 0x6F 0x6F 0x2E 0x6D 0x70 0x33 0x62 0x61 0x72 0x2E 0x6D 0x70 0x33 0x63 0x1B0 0x1EDD 0x6E 0x67 

If you store those list of filenames in a file, then:

perl -CI -lne 'print join " ", map < sprintf "0x%X", $_ >unpack "U*"'  

I think this could be done with a simple Perl script:

perl -we 'foreach my $file (glob("*")) < printf "0x%02X ", ord($_) foreach split//, $file; print "\n" >; ' 

resulting in output similar to yours when the directory contains files foo.mp3 and bar.mp3 :

0x62 0x61 0x72 0x2E 0x6D 0x70 0x33 0x66 0x6F 0x6F 0x2E 0x6D 0x70 0x33 

(I think glob() sorts the names.)

(* except those that start with a dot)

This will just print the actual bytes in the filenames, as they are stored on the file system. If you have files whose names are not in UTF-8, the script will not convert them.

You could also do something like piping the output of ls to od or xxd , which would also work with other data than lists of file names, but would bring all the problems that come with reading ls , and it would be hard to get the file names separated to different lines.

Источник

How to convert \uXXXX unicode to UTF-8 using console tools in *nix

I use curl to get some URL response, it's JSON response and it contains unicode-escaped national characters like \u0144 (ń) and \u00f3 (ó) . How can I convert them to UTF-8 or any other encoding to save into file?

11 Answers 11

Might be a bit ugly, but echo -e should do it:

-e interprets escapes, -n suppresses the newline echo would normally add.

Note: The \u escape works in the bash builtin echo , but not /usr/bin/echo .

As pointed out in the comments, this is bash 4.2+, and 4.2.x have a bug handling 0x00ff/17 values (0x80-0xff).

@cbuckley it was bash (as I added to the post, I figured out it was the bash builtin), but zsh's echo works with \u too. csh 's does not, however.

@KrzysztofWolny The example is already in my post, either store the URL you're trying to get into the URL variable, or just replace it manually. $(command) executes command , so $(curl $URL) fetches the page at $URL .

I don't know which distribution you are using, but uni2ascii should be included.

$ sudo apt-get install uni2ascii 

It only depend on libc6, so it's a lightweight solution (uni2ascii i386 4.18-2 is 55,0 kB on Ubuntu)!

$ echo 'Character 1: \u0144, Character 2: \u00f3' | ascii2uni -a U -q Character 1: ń, Character 2: ó 

That allow to display it, but not to save/convert it. even with uni2ascii unicode.txt > newfile.txt . iconv do it well

echo 'Character 1: \u0144, Character 2: \u00f3' | ascii2uni -a U -q > newfile.txt clearly works and saves the output into newfile.txt .

I found native2ascii from JDK as the best way to do it:

native2ascii -encoding UTF-8 -reverse src.txt dest.txt 

Assuming the \u is always followed by exactly 4 hex digits:

#!/usr/bin/perl use strict; use warnings; binmode(STDOUT, ':utf8'); while (<>) < s/\\u([0-9a-fA-F])/chr(hex($1))/eg; print; > 

The binmode puts standard output into UTF-8 mode. The s. command replaces each occurrence of \u followed by 4 hex digits with the corresponding character. The e suffix causes the replacement to be evaluated as an expression rather than treated as a string; the g says to replace all occurrences rather than just the first.

You can save the above to a file somewhere in your $PATH (don't forget the chmod +x ). It filters standard input (or one or more files named on the command line) to standard output.

Again, this assumes that the representation is always \u followed by exactly 4 hex digits. There are more Unicode characters than can be represented that way, but I'm assuming that \u12345 would denote the Unicode character 0x1234 (ETHIOPIC SYLLABLE SEE) followed by the digit 5 .

In C syntax, a universal-character-name is either \u followed by exactly 4 hex digits, or \U followed by exactly 8 hexadecimal digits. I don't know whether your JSON responses use the same scheme. You should probably find out how (or whether) it encodes Unicode characters outside the Basic Multilingual Plane (the first 2 16 characters).

Источник

Оцените статью
Adblock
detector