php конвертировать в utf 8
Кодировка — Как конвертировать файл в UTF-8 в PHP?
Можно ли конвертировать файл в UTF-8 на моем конце?
Если у меня есть доступ к файлу после подачи с
Замечания: Пользователь может загрузить файл CSV с любым типом кодировки, я обычно сталкиваюсь с неизвестный 8-битный кодировок.
Но проблема в том, что этот код удаляет специальные символы, такие как одинарные кавычки.
Я поставил это для дополнительной информации. Спасибо за тех, кто может помочь!
Решение
Попробуйте это.
Пример, который я использовал, был чем-то, что я делал в тестовой среде, возможно, вам придется немного изменить код.
У меня был текстовый файл со следующими данными в:
Затем у меня была форма, в которую входил файл и выполнялся следующий код:
Когда данные публикуются, я сохраняю файл в переменной. Очевидно, что если вы используете multiple Атрибут ваш код будет выглядеть не совсем так.
$handle хранит все содержимое текстового файла в формате только для чтения; следовательно «r» аргумент.
$enc использует mb_detect_encoding функция для определения кодировки (дух).
Сначала у меня были проблемы с получением правильной кодировки. Настройка encoding_list использовать только UTF-8 и настройки strict чтобы быть правдой.
Если кодировка UTF-8, то я просто печатаю строку, если нет, я конвертирую ее в UTF-8, используя iconv функция.
Другие решения
предупреждение, непроверенный код (я внезапно спешу), но может выглядеть примерно так:
Вы можете преобразовать текст файла в двоичные данные, используя следующие
после преобразования данных в двоичный файл вы просто изменяете текст на метод php mb_convert_encoding ($ fileText, «UTF-8»);
mb_convert_encoding
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
mb_convert_encoding — Преобразует кодировку символов
Описание
Список параметров
Строка ( string ) или массив ( array ), для преобразования.
Параметр для указания исходной кодировки строки. Это может быть массив ( array ), или строка со списком кодировок через запятую. Если параметр from_encoding не указан, то кодировка определяется автоматически.
Возвращаемые значения
Преобразованная строка ( string ) или массив ( array ) или false в случае возникновения ошибки.
Ошибки
Список изменений
Примеры
Пример #1 Пример использования mb_convert_encoding()
Смотрите также
User Contributed Notes 32 notes
For my last project I needed to convert several CSV files from Windows-1250 to UTF-8, and after several days of searching around I found a function that is partially solved my problem, but it still has not transformed all the characters. So I made this:
I’ve been trying to find the charset of a norwegian (with a lot of ø, æ, å) txt file written on a Mac, i’ve found it in this way:
= «A strange string to pass, maybe with some ø, æ, å characters.» ;
Hope can help someone
in your php.ini. Be sure to include the quotes around none. Or at run-time with
Hey guys. For everybody who’s looking for a function that is converting an iso-string to utf8 or an utf8-string to iso, here’s your solution:
public function encodeToUtf8($string) <
return mb_convert_encoding($string, «UTF-8», mb_detect_encoding($string, «UTF-8, ISO-8859-1, ISO-8859-15», true));
>
public function encodeToIso($string) <
return mb_convert_encoding($string, «ISO-8859-1», mb_detect_encoding($string, «UTF-8, ISO-8859-1, ISO-8859-15», true));
>
For me these functions are working fine. Give it a try
My solution below was slightly incorrect, so here is the correct version (I posted at the end of a long day, never a good idea!)
Again, this is a quick and dirty solution to stop mb_convert_encoding from filling your string with question marks whenever it encounters an illegal character for the target encoding.
Another sample of recoding without MultiByte enabling.
(Russian koi->win, if input in win-encoding already, function recode() returns unchanged string)
utf8_encode
(PHP 4, PHP 5, PHP 7, PHP 8)
utf8_encode — Кодирует строку ISO-8859-1 в кодировке UTF-8
Описание
Эта функция конвертирует строку string из кодировки ISO-8859-1 в UTF-8
Список параметров
Возвращаемые значения
Список изменений
Версия | Описание |
---|---|
7.2.0 | Функция была перенесена в ядро PHP, таким образом отменив требование модуля XML для использования этой функции. |
Смотрите также
User Contributed Notes 23 notes
Please note that utf8_encode only converts a string encoded in ISO-8859-1 to UTF-8. A more appropriate name for it would be «iso88591_to_utf8». If your text is not encoded in ISO-8859-1, you do not need this function. If your text is already in UTF-8, you do not need this function. In fact, applying this function to text that is not encoded in ISO-8859-1 will most likely simply garble that text.
If you need to convert text from any encoding to any other encoding, look at iconv() instead.
Here’s some code that addresses the issue that Steven describes in the previous comment;
/* This structure encodes the difference between ISO-8859-1 and Windows-1252,
as a map from the UTF-8 encoding of some ISO-8859-1 control characters to
the UTF-8 encoding of the non-control characters that Windows-1252 places
at the equivalent code points. */
Walk through nested arrays/objects and utf8 encode all strings.
If you need a function which converts a string array into a utf8 encoded string array then this function might be useful for you:
My version of utf8_encode_deep,
In case you need one that returns a value without changing the original.
I tried a lot of things, but this seems to be the final fail save method to convert any string to proper UTF-8.
If your string to be converted to utf-8 is something other than iso-8859-1 (such as iso-8859-2 (Polish/Croatian)), you should use recode_string() or iconv() instead rather than trying to devise complex str_replace statements.
If you are looking for a function to replace special characters with the hex-utf-8 value (e.g. für Webservice-Security/WSS4J compliancy) you might use this:
$textstart = «Größe»;
$utf8 =»;
$max = strlen($txt);
I was searching for a function similar to Javascript’s unescape(). In most cases it is OK to use url_decode() function but not if you’ve got UTF characters in the strings. They are converted into %uXXXX entities that url_decode() cannot handle.
I googled the net and found a function which actualy converts these entities into HTML entities (&#xxx;) that your browser can show correctly. If you’re OK with that, the function can be found here: http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps
But it was not OK with me because I needed a string in my charset to make some comparations and other stuff. So I have modified the above function and in conjuction with code2utf() function mentioned in some other note here, I have managed to achieve my goal:
// Validate Unicode UTF-8 Version 4
// This function takes as reference the table 3.6 found at http://www.unicode.org/versions/Unicode4.0.0/ch03.pdf
// It also flags overlong bytes as error
This function may be useful do encode array keys and values [and checks first to see if it’s already in UTF format]:
[NOTE BY danbrown AT php DOT net: Original function written by (cmyk777 AT gmail DOT com) on 28-JAN-09.]
Avoiding use of preg_match to detect if utf8_encode is needed:
I recommend using this alternative for every language:
Don’t forget to set all your pages to «utf-8» encoding, otherwise just use HTML entities.
This function I use convert Thai font (iso-8859-11) to UTF-8. For my case, It work properly. Please try to use this function if you have a problem to convert charset iso-8859-11 to UTF-8.
$iso8859_11 = array(
«\xa1» => «\xe0\xb8\x81»,
«\xa2» => «\xe0\xb8\x82»,
«\xa3» => «\xe0\xb8\x83»,
«\xa4» => «\xe0\xb8\x84»,
«\xa5» => «\xe0\xb8\x85»,
«\xa6» => «\xe0\xb8\x86»,
«\xa7» => «\xe0\xb8\x87»,
«\xa8» => «\xe0\xb8\x88»,
«\xa9» => «\xe0\xb8\x89»,
«\xaa» => «\xe0\xb8\x8a»,
«\xab» => «\xe0\xb8\x8b»,
«\xac» => «\xe0\xb8\x8c»,
«\xad» => «\xe0\xb8\x8d»,
«\xae» => «\xe0\xb8\x8e»,
«\xaf» => «\xe0\xb8\x8f»,
«\xb0» => «\xe0\xb8\x90»,
«\xb1» => «\xe0\xb8\x91»,
«\xb2» => «\xe0\xb8\x92»,
«\xb3» => «\xe0\xb8\x93»,
«\xb4» => «\xe0\xb8\x94»,
«\xb5» => «\xe0\xb8\x95»,
«\xb6» => «\xe0\xb8\x96»,
«\xb7» => «\xe0\xb8\x97»,
«\xb8» => «\xe0\xb8\x98»,
«\xb9» => «\xe0\xb8\x99»,
«\xba» => «\xe0\xb8\x9a»,
«\xbb» => «\xe0\xb8\x9b»,
«\xbc» => «\xe0\xb8\x9c»,
«\xbd» => «\xe0\xb8\x9d»,
«\xbe» => «\xe0\xb8\x9e»,
«\xbf» => «\xe0\xb8\x9f»,
«\xc0» => «\xe0\xb8\xa0»,
«\xc1» => «\xe0\xb8\xa1»,
«\xc2» => «\xe0\xb8\xa2»,
«\xc3» => «\xe0\xb8\xa3»,
«\xc4» => «\xe0\xb8\xa4»,
«\xc5» => «\xe0\xb8\xa5»,
«\xc6» => «\xe0\xb8\xa6»,
«\xc7» => «\xe0\xb8\xa7»,
«\xc8» => «\xe0\xb8\xa8»,
«\xc9» => «\xe0\xb8\xa9»,
«\xca» => «\xe0\xb8\xaa»,
«\xcb» => «\xe0\xb8\xab»,
«\xcc» => «\xe0\xb8\xac»,
«\xcd» => «\xe0\xb8\xad»,
«\xce» => «\xe0\xb8\xae»,
«\xcf» => «\xe0\xb8\xaf»,
«\xd0» => «\xe0\xb8\xb0»,
«\xd1» => «\xe0\xb8\xb1»,
«\xd2» => «\xe0\xb8\xb2»,
«\xd3» => «\xe0\xb8\xb3»,
«\xd4» => «\xe0\xb8\xb4»,
«\xd5» => «\xe0\xb8\xb5»,
«\xd6» => «\xe0\xb8\xb6»,
«\xd7» => «\xe0\xb8\xb7»,
«\xd8» => «\xe0\xb8\xb8»,
«\xd9» => «\xe0\xb8\xb9»,
«\xda» => «\xe0\xb8\xba»,
«\xdf» => «\xe0\xb8\xbf»,
«\xe0» => «\xe0\xb9\x80»,
«\xe1» => «\xe0\xb9\x81»,
«\xe2» => «\xe0\xb9\x82»,
«\xe3» => «\xe0\xb9\x83»,
«\xe4» => «\xe0\xb9\x84»,
«\xe5» => «\xe0\xb9\x85»,
«\xe6» => «\xe0\xb9\x86»,
«\xe7» => «\xe0\xb9\x87»,
«\xe8» => «\xe0\xb9\x88»,
«\xe9» => «\xe0\xb9\x89»,
«\xea» => «\xe0\xb9\x8a»,
«\xeb» => «\xe0\xb9\x8b»,
«\xec» => «\xe0\xb9\x8c»,
«\xed» => «\xe0\xb9\x8d»,
«\xee» => «\xe0\xb9\x8e»,
«\xef» => «\xe0\xb9\x8f»,
«\xf0» => «\xe0\xb9\x90»,
«\xf1» => «\xe0\xb9\x91»,
«\xf2» => «\xe0\xb9\x92»,
«\xf3» => «\xe0\xb9\x93»,
«\xf4» => «\xe0\xb9\x94»,
«\xf5» => «\xe0\xb9\x95»,
«\xf6» => «\xe0\xb9\x96»,
«\xf7» => «\xe0\xb9\x97»,
«\xf8» => «\xe0\xb9\x98»,
«\xf9» => «\xe0\xb9\x99»,
«\xfa» => «\xe0\xb9\x9a»,
«\xfb» => «\xe0\xb9\x9b»
);
// Reads a file story.txt ascii (as typed on keyboard)
// converts it to Georgian character using utf8 encoding
// if I am correct(?) just as it should be when typed on Georgian computer
// it outputs it as an html file
//
// http://www.comweb.nl/keys_to_georgian.html
// http://www.comweb.nl/keys_to_georgian.php
// http://www.comweb.nl/story.txt
keys to unicode code
// this meta tag is needed
// note the sylfean font seems to be standard installed on Windows XP
// It supports Georgian
Re the previous post about converting GB2312 code to Unicode code which displayed the following function:
In the original function, the first latin chacter was dropped and it was not converting the first non-latin character after the latin text (everything was shifted one character too far to the right). Reversing those two lines makes it work correctly in every example I have tried.
Also, the source of the gb2312.txt file needed for this to work has changed. You can find it a couple places:
Someday they might be hardcoded into PHP.
*/
The following Perl regular expression tests if a string is well-formed Unicode UTF-8 (Broken up after each | since long lines are not permitted here. Please join as a single line, no spaces, before use.):
PHP: преобразуйте любую строку в UTF-8, не зная исходного набора символов или, по крайней мере, попробуйте
у меня есть приложение, которое имеет дело с клиентами со всего мира, и, естественно, я хочу, чтобы все, что входит в мои базы данных, было закодировано UTF-8.
для загрузки файлов мне нравится идея попросить конечного пользователя указать кодировку, которую они используют, и показать им превью того, как будет выглядеть вывод, но это не помогает против неприятных хакеров (на самом деле, это может сделать их жизнь немного облегчающий.)
Я читал другие вопросы SO по этому вопросу, но, похоже, все они имеют тонкие различия, такие как «мне нужно разобрать RSS-каналы» или «я соскребаю данные с веб-сайтов» (или, действительно, «Вы не можете»).
но должно быть что-то, что, по крайней мере, имеет хороший попробовать!
10 ответов
то, что вы просите, чрезвычайно трудно. Если возможно, лучше всего заставить пользователя указать кодировку. Предотвращение атаки не должно быть намного проще или сложнее таким образом.
тем не менее, вы можете попробовать сделать это:
установка его в strict может помочь вам получить лучший результат.
в Родине России у нас есть 4 популярных кодировки, поэтому ваш вопрос пользуется большим спросом здесь.
только по кодам символов char вы не можете обнаружить кодировку, потому что кодовые страницы пересекаются. Некоторые кодовые страницы на разных языках имеют даже полное пересечение. Итак,нам нужен другой подход.
единственный способ работы с неизвестными кодировками-это работа с вероятностями. Поэтому мы не хотим ответить на вопрос «Что такое кодировка текста?»мы пытаясь понять»какова наиболее вероятная кодировка этого текста?«.
один парень здесь, в популярном российском технологическом блоге, изобрел этот подход:
создайте диапазон вероятностей кодов символов в каждой кодировке, которую вы хотите поддержать. Вы можете построить его, используя некоторые большие тексты на вашем языке (например, некоторую фантастику, используйте Шекспира для английского языка и Толстого для русского, lol ). Вы получите smth так:
далее. Вы берете текст в неизвестной кодировке и для каждой кодировки в вашем «вероятностном словаре» вы ищете частоту каждого символа в неизвестном закодированном тексте. Сумма вероятностей символов. Скорее всего, победителем станет кодирование с более высоким рейтингом. Лучшие результаты для больших текстов.
если вы заинтересованы, Я с удовольствием помогу Вам с этой задачей. Мы можем значительно повысить точность путем построения двух-charcodes список вероятностная.
кстати. mb_detect_encoding certanly не работает. Да, конечно. Пожалуйста, возьмите посмотрите исходный код mb_detect_encoding в » ext/mbstring/libmbfl/mbfl / mbfl_ident.с.»
Вы, наверное, пробовали это, но почему бы просто не использовать функцию mb_convert_encoding? Он попытается автоматически обнаружить набор символов предоставленного текста или вы можете передать ему список.
кроме того, я попытался запустить:
и результаты одинаковы для обоих. Как вы видите, что ваш текст усечен до «fianc»? это в БД или в браузере?
невозможно определить кодировку строки, которая является полностью точной. Есть способы попытаться угадать кодировку. Одним из этих способов, и, вероятно,/в настоящее время лучшим в PHP, является mb_detect_encoding(). Это будет сканировать вашу строку и искать вхождения вещей, уникальных для определенных наборов символов. В зависимости от вашей строки могут не быть таких различимых вхождений.
есть только несколько разных символов, и, что еще хуже, они представлены одними и теми же байтами. Невозможно определить, дается ли строка, не зная, что это кодировка, должен ли байт 0xA4 обозначать ¤ или € в вашей строке, поэтому нет способа узнать, что это точная кодировка.
(Примечание: Вы можете добавить человеческий фактор или еще более продвинутое сканирование техника (например, что предлагает Ороборос102), чтобы попытаться выяснить, основываясь на окружающем контексте, должен ли персонаж быть ¤ или€, хотя это кажется слишком далеким мостом)
есть более различимые различия между, например, UTF-8 и ISO-8859-1, поэтому по-прежнему стоит попытаться выяснить, когда вы не уверены, хотя вы можете и никогда не должны полагаться на то, что это правильно.
есть и другие способы обеспечения правильной кодировки. Что касается форм, попробуйте применить UTF-8 как можно больше (проверьте snowman, чтобы убедиться, что представление yout будет UTF-8 в каждом браузере:http://intertwingly.net/blog/2010/07/29/Rails-and-Snowmen ) Это делается, по крайней мере, вы можете быть уверены, что каждый текст, представленный через ваши формы utf_8. Что касается загруженных файлов, попробуйте запустить на нем команду unix ‘file-i’, например, exec() (если это возможно на вашем сервере), чтобы помочь обнаружению (используя спецификацию документа.) Что касается данных очистки, вы можете прочитать заголовки HTTP, которые обычно указывают кодировку. При анализе XML-файлов проверьте, содержат ли метаданные XML определение кодировки.
вместо того, чтобы пытаться автоматически угадать кодировку, вы должны сначала попытаться обеспечить определенную кодировку себя, где это возможно, или пытается захватить определение из источника, из которого вы его получаете (если применимо), прежде чем прибегать к обнаружению.
Я не думаю, что это проблема. Приложение знает источник входных данных. Если это из формы, используйте кодировку UTF-8 в вашем случае. Эта работа. Просто проверьте данные предоставлено правильно закодировано (валидация). Имейте в виду, что не все базы данных поддерживают UTF-8 в полном диапазоне.
Если это файл, вы не сохраните его UTF-8, закодированный в базе данных, но в двоичной форме. Когда вы снова выводите файл, также используйте двоичный вывод, тогда это полностью прозрачно.
ваша идея хорошая, что пользователь может сказать кодировку, может ли он / она сказать в любом случае после загрузки файла, так как он двоичный.
поэтому я должен признать, что не вижу конкретный вопрос, который вы поднимаете своим вопросом. Но, возможно, вы можете добавить некоторые подробности, в чем ваша проблема.
вы можете создать набор метрик, чтобы попытаться угадать, какая кодировка используется. Опять же, не идеально, но может поймать некоторые промахи из mb_detect_encoding ().
есть некоторые действительно хорошие ответы и попытки ответить на свой вопрос здесь. Я не мастер кодирования, но я понимаю ваше желание иметь чисто UTF-8 стек до конца к вашей базе данных. Я использую MySQL utf8mb4 кодировка для таблиц, полей и связей.
моя ситуация сводилась к «я просто хочу, чтобы мои дезинфицирующие средства, валидаторы, бизнес-логика и подготовленные заявления имели дело с UTF-8, когда данные поступают из HTML-форм, или e-mail Регистрация ссылки.»Итак, по-своему просто, я начал с этой идеи:
еще, если это ISO-8859-1 или ASCII
a. Попытка преобразования в UTF-8 (подождите, не закончено)
b. Обнаружьте кодировку преобразованного значения
d. Эльза, throw new RuntimeException
из моего абстрактного класса Sanitizer
более того, что происходит когда зашифрованные данные добавляются в мои ссылки регистрации электронной почты (используя OpenSSL или mcrypt )? Может ли это помешать расшифровке? Как насчет Windows-1252? Как насчет последствий для безопасности? Использование utf8_decode() и utf8_encode() на Sanitizer::isUTF8 сомнительный.
How to convert a file to UTF-8 in php?
Is it possible to convert a file into UTF-8 on my end?
If I have an access on the file after the submission with
Note: The user can upload a CSV file with any kind of charset, I usually encounter an unknown 8-bit charset.
But the problem is, this code remove special characters like single quote.
I put it for additional information. Thanks for those who can help!
5 Answers 5
before you can convert it to utf-8, you need to know what characterset it is. if you can’t figure that out, you can’t in any sane way convert it to utf8.. however, an insane way to convert it to utf-8, if the encoding cannot be determined, is to simply strip any bytes that doesn’t happen to be valid in utf-8, you might be able to use that as a fallback.
warning, untested code (im suddenly in a hurry), but may look something like this:
Try this out.
The example I have used was something I was doing in a test environment, you might need to change the code slightly.
I had a text file with the following data in:
Then I had a form which took a file input in and performed the following code:
When the data is posted I store the file in a variable. Obviously, if you are using the multiple attribute your code won’t look quite like this.
$handle stores the entire contents of the text file, in a read-only format; hence the «r» argument.
$enc uses the mb_detect_encoding function to detect the encoding (duh).
At first I was having trouble with obtaining the correct encoding. Setting the encoding_list to use only UTF-8, and setting strict to be true.
If the encoding is UTF-8 then I simply print the line, if it didn’t I converted it to UTF-8 using the iconv function.