Поддержка Проблемы и решения Транслитерация русский -> russkiy и т. п.

  • На сайте стали появляться медиафайлы с русскими именами. Есть некоторые плагины которые заменяют кириллицу на латиницу, я посмотрел код, там каждый веб-мастер пишет свой массивчик с набором символов и замену к ним — это как-то буэ. Волнует именно то, что с таким подходом можно что-то пропустить. Например,

    і ї ё ы ъ э ў ą ć ę ł ń ó ś ź ż à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö × ø ù ú û ü ý þ ÿ ß ő ű ě š č ř ž ý á é ď ť ň ú ů α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω ά έ ή ί ό ύ ώ ς ΐ ϊ ϋ ΰ.

    И таких символом тьма, а надо чтобы в именах только латинские буквы были.

    В PHP наверняка есть какие-то готовые функции для этого или даже в WordPress? Советы, куда копать?

    Уже смотрел
    https://toster.ru/q/21374 — буэ, вот таких решений точно не надо.
    http://ru2.php.net/manual/ru/function.iconv.php — не совсем понял что и как 🙂 Тут вроде кодировка, а не транслитерация?

Просмотр 9 ответов — с 1 по 9 (всего 9)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    И таких символом тьма, а надо чтобы в именах только латинские буквы были.

    В PHP или WordPress таких функций, увы, пока нет. Как вариант:

    1. Пропустить имя через remove_accents(), чтобы убрать диакритические знаки.
    2. Воспользоваться одной из функций транслитерации по таблице, пусть и «буэ» 🙂
    3. Оставшиеся символы заменить на дефис:
      $name = preg_replace( '/[^A-Za-z0-9\-]/', '-', $name );

    В плагине Cyr-To-Lat на текущий момент реализованы второй и третий пункт. Думаю, имеет смысл добавить туда и первый.

    Что-то я подвис. Сергей, спасибо, а не подскажешь, почему при загрузке файлов с названиями на русском языке на сервере они сохраняются вот так: #U043d#U0435#U0443#U0434#U0430#U0447#U0430.jpg

    Это что-то с сервером не так или WordPress заменяет кириллические символы на это? Копаюсь в исходниках WP, нашел sanitize_file_name (), но она вроде ничего такого не делает. Других плагинов, которые могли бы портить имена вроде нет.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    WordPress имена файлов не меняет. Проблема, скорее всего, в сервере или всё же в одном из плагинов.

    В PHP есть баг с загрузкой файлов под Windows, но там должны получиться кракозябры, а не цифры 🙂

    Нашел библиотеку и модуль для транслитерации в PHP:
    https://github.com/ashtokalo/php-translit
    http://pecl.php.net/package/translit

    Второе, наверное, более интересное, но по исходникам не очень ясно что и как оно делает.

    Кстати говоря, обнаружилась неприятная ситуация при загрузке файла с именем: 🚀.jpg (в качестве имени iOS смайлик). Файл на сервере появился и разные размеры картинок под него сделались. Но на сайте битая картинка получается. Надо еще какие-то проверки и реплейсы добавлять. Задача была изначально хранить на сервере только хорошие файлы с нормальными именами, а не черте пойми какие.

    Как обычно, в вебе все через одно место 🙂

    Модератор Yui

    (@fierevere)

    ゆい

    Файл на сервере появился и разные размеры картинок под него сделались

    а почему нет? тут все корректно работает с UTF8, по крайней мере на юниксах

    Но на сайте битая картинка получается

    браузеры обычно используют ISO8859-1 «url encoding» если они явно не получили charset от сервера, а это гарантировано случается только для html

    а вариант переименовывать файл по md5 хешу не годится вам ? 😀
    дешево и сердито

    На дебиан сервере залилось (но битый адрес). На мак ос сервере не залилось — ВП выдал хттп еррор.

    Мд5 рассчитывать для имени файла или для самого файла? Второй вариант не возможен через фильтр sanitize file name

    И еще один косяк. @sergeybiryukov когда плагин (Cyr-To-Lat) делает транслит для файлов то некоторые буквы заменяются на 2 символа. Это значит, что мы можем превысить размер длины файла. Как я понял WP за этим никак не следит сам. Так что перед отдачей файла надо еще и размер проверить и отпиливать то, что не влезает.

    Вобщем я посмотрел тут как на wordpress.com разные файлы сервер кушает и написал вот так https://bitbucket.org/korobochkin/filenames-in-wordpress/src/d28d0afbc2c327999a929e69235869bd9102e01b/plugin/plugin.php?at=master

    Длина файла до 130 символов обрезается и все.

Просмотр 9 ответов — с 1 по 9 (всего 9)
  • Тема «Транслитерация русский -> russkiy и т. п.» закрыта для новых ответов.