Как исправить ошибку с translit в bash?

Как можно исправить ошибку кодировки при использовании команды iconv для перекодирования текста из utf-8 в ascii//TRANSLIT, поскольку в результате получаются знаки вопроса?
  • 6 января 2024 г. 8:07
Ответы на вопрос 2
Перекодировка текста из UTF-8 в ASCII с использованием `iconv` и опцией `//TRANSLIT` позволяет заменить символы, которых нет в целевой кодировке, на похожие или разумные альтернативы из ASCII. Однако, если в исходном тексте встречаются символы, для которых `iconv` не находит соответствия в ASCII, они могут быть заменены на знаки вопроса (?).

Одним из возможных способов исправления ошибки может быть установка правильной локали в вашей системе, чтобы `iconv` корректно мог использовать механизм транслитерации.

Проверьте текущую локаль, выполнив команду:

```bash
locale
```

Если ваша локаль не установлена на `en_US.UTF-8` (или другую поддерживаемую локаль с UTF-8), попробуйте её настроить:

```bash
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
```

Теперь попробуйте ещё раз использовать `iconv` с опцией `//TRANSLIT`:

```bash
iconv -f UTF-8 -t ASCII//TRANSLIT input.txt -o output.txt
```

Если подход с локалью не работает, возможно, придется вручную обработать специфические символы, которые `iconv` не может транслитерировать. Это можно сделать с помощью `sed` или других инструментов для обработки текста в командной строке. Вот пример такой обработки для символа 'é':

```bash
iconv -f UTF-8 -t ASCII//TRANSLIT input.txt | sed "s/é/e/g" > output.txt
```

Здесь `sed "s/é/e/g"` заменяет все вхождения 'é' на 'e' после транслитерации `iconv`.

Если необходимо обработать множество различных символов, возможно потребуется написать более сложный скрипт для замены или воспользоваться инструментом под названием `translit`, который предоставляет более широкие возможности транслитерации.

Учтите, что подобные замены и транслитерации могут быть неидеальными, так как есть символы без однозначного соответствия в ASCII, и их замена потенциально может нарушить осмысленность текста или правильность имен собственных. Поэтому стоит внимательно проверять результаты транслитерации.
Please note that iconv('UTF-8', 'ASCII//TRANSLIT', ...) doesn't work properly when locale category LC_CTYPE is set to C or POSIX. You must choose another locale otherwise all non-ASCII characters will be replaced with question marks. This is at least true with glibc 2.5.


https://www.php.net/manual/en/function.iconv.php
Похожие вопросы