Как избежать символов Junk / garbage при чтении данных с нескольких языков?

Я разбираю rss новостные ленты из более чем 10 разных языков.

Весь синтаксический анализ выполняется в java, и данные хранятся в MySQL до того, как мои API, написанные на php, отвечают на клиентов.

Когда я читаю данные, я постоянно сталкиваюсь с мусорными символами.

Что я пробовал:

  1. Я настроил свой MySQL для хранения данных utf-8. Мой db, table и даже столбец имеют UTF8 в качестве кодировки по умолчанию.
  2. При подключении моего db я задал результаты набора символов как utf-8

Когда я запускаю файл jar вручную, чтобы вставить данные, символ выглядит нормально. Но когда я устанавливаю cronjob для одного и того же файла jar, я снова сталкиваюсь с проблемой.

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

Есть ли что-то, что мне не хватает?

Образцы мусора:

Гуджарати : «àª ° ૠલàªμà «‡ મૠસાઠ«àª ° ૠપાàª, સામાન àªšà «<ઠ° à« € ઠ¥ àª¶à «‡ ઠ¤à «<મળશૠ‡ àªμળતઠ°! »

Малиалам : «à'¨àμ ‡ à'ªààààªà'¾à'³à'¿à'²àμ ‡ à'• àμà' • àμà'³àμà'³ à'• àμ <à'³àμâ € à'¨à'àà '° à' • àμà' • àμ à'• àμà' ± à'šàμà'šàμ "

Английский : Президиум банка Bank расширяет возможности блоков питания в финансовом секторе

Гуджарати начинает «правильно»? И Малиалама начинается, верно? И английский должен был включать Bureau's .

Это классический случай

  • Байты, которые у вас есть на клиенте, правильно закодированы в utf8. ( Bureau закодировано в подмножестве ascii / latin1 utf8, но ' не апостип ascii»).
  • Вы связаны с SET NAMES latin1 (или set_charset('latin1') или …), вероятно, по умолчанию. (Это должно было быть utf8 .)
  • Столбец в таблице был объявлен CHARACTER SET latin1 . (Или, возможно, это было унаследовано из таблицы / базы данных.) (Это должно было быть utf8 .)

Исправлением для данных является «2-шаг ALTER».

 ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...; ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...; 

где длины достаточно велики, а другие «…» имеют что-то еще ( NOT NULL и т. д.) уже в столбце.

К сожалению, если у вас есть много столбцов для работы, это займет много ALTERs. Вы можете (должны) MODIFY все необходимые столбцы для VARBINARY для одной таблицы в паре ALTERs .

Исправление для кода – установить utf8 в качестве соединения; это зависит от api, используемого в PHP. ALTERs изменят определение столбца.

редактировать

У вас есть VARCHAR с неправильным CHARACTER SET . Следовательно, вы видите Mojibake как રેલ . Большинство конверсионных методов пытаются сохранить રેલ , но это не то, что вам нужно. Вместо этого, делая шаг к VARBINARY сохраняет бит, игнорируя старое определение бит, представляющих символы с латинским кодированием. Второй шаг снова сохраняет биты, но теперь утверждает, что они представляют символы utf8.