MySQL или PHP добавляет Â всякий раз, когда используется £ - PullRequest
9 голосов
/ 22 декабря 2008

Все предоставленные ответы были отличными, я упомянул в комментариях к ответу Альнитака, что мне нужно пойти посмотреть на мой скрипт CSV Generation, потому что по какой-то причине он не выводил UTF-8.

Как правильно было указано, он выдает UTF-8 - проблема была в старой версии Microsoft Excel, которая не выбирала кодировку так, как мне бы хотелось.

Мое существующее поколение CSV выглядело примерно так:

// Create file and exit;
$filename = $file."_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header( "Content-disposition: filename=".$filename.".csv");
echo $csv_output;

Теперь это выглядит так:

// Create file and exit;
$filename = $file."_".date("Y-m-d_H-i",time());
header("Content-type: text/csv; charset=ISO-8859-1");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=".$filename.".csv");

echo iconv('UTF-8', 'ISO-8859-1', $csv_output);

----------------------------------------------- --------

ОРИГИНАЛЬНЫЙ ВОПРОС

Привет

У меня есть форма, которая собирает данные, форма работает нормально, но я только что заметил, что если кто-то печатает или использует символ «£», MySQL DB заканчивается на «Â £».

Не совсем уверен, где и как это предотвратить, какой код и информацию о БД следует выполнять:

MySQL details

mysql> SHOW COLUMNS FROM fraud_report;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | mediumint(9) |      | PRI | NULL    | auto_increment |
| crm_number   | varchar(32)  | YES  |     | NULL    |                |
| datacash_ref | varchar(32)  | YES  |     | NULL    |                |
| amount       | varchar(32)  | YES  |     | NULL    |                |
| sales_date   | varchar(32)  | YES  |     | NULL    |                |
| domain       | varchar(32)  | YES  |     | NULL    |                |
| date_added   | datetime     | YES  |     | NULL    |                |
| agent_added  | varchar(32)  | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
8 rows in set (0.03 sec)

Функция PHP

function    processFraudForm($crm_number, $datacash_ref, $amount, $sales_date, $domain, $agent_added) {

    // Insert Data to DB
    $sql    = "INSERT INTO fraud_report (id, crm_number, datacash_ref, amount, sales_date, domain, date_added, agent_added) VALUES (NULL, '$crm_number', '$datacash_ref', '$amount', '$sales_date', '$domain', NOW(), '$agent_added')";
    $result = mysql_query($sql) or die (mysql_error());

    if ($result) {
        $outcome = "<div id=\"success\">Emails sent and database updated.</div>";
    } else {
        $outcome = "<div id=\"error\">Something went wrong!</div>";
    }

    return $outcome;
}

Пример записи в БД

+----+------------+--------------+---------+------------+--------------------+---------------------+------------------+
| id | crm_number | datacash_ref | amount  | sales_date | domain             | date_added          | agent_added      |
+----+------------+--------------+---------+------------+--------------------+---------------------+------------------+
| 13 | 100xxxxxxx | 10000000     | £10.93 | 18/12/08   |  blargh.com        | 2008-12-22 10:53:53 | agent.name | 

Ответы [ 7 ]

17 голосов
/ 22 декабря 2008

То, что вы видите, - это кодировка UTF-8 - это способ хранения символов Unicode в относительно компактном формате.

Символ фунта имеет значение 0x00a3 в Unicode, но когда он записан в UTF-8, он становится 0xc2 0xa3, и это то, что хранится в базе данных. Кажется, ваша таблица базы данных уже настроена на использование кодировки UTF-8. Это хорошая вещь !

Если вы извлечете значение из базы данных и отобразите его на терминале, совместимом с UTF-8 (или на веб-странице, объявленной как кодируемая в UTF-8), оно снова будет выглядеть как обычный знак фунта.

8 голосов
/ 22 декабря 2008

 £ - это 0xC2 0xA3, что является кодировкой UTF-8 для символа £, поэтому вы сохраняете его как UTF-8, но, вероятно, просматриваете его как Latin-1 или что-то отличное от UTF-8

Полезно знать, как распознать и декодировать UTF-8 вручную - посетите страницу википедии , чтобы узнать, как работает кодировка:

  • 0xC2A3 = 110 00010 10 100011
  • Жирные части являются актуальными «полезная нагрузка», которая дает 10100011, 0xA3, символ фунта.
7 голосов
/ 11 ноября 2010

В PHP другое небольшое решение заключается в преобразовании строки в возвращенную строку utf8:

print iconv('UTF-8', 'ASCII//TRANSLIT', "Mystring â"); //"Mystring "

Или на других платформах запустить системный вызов для команды inconv (linux / osx)

http://php.net/manual/en/function.iconv.php#83238

2 голосов
/ 22 декабря 2008

Вы должны предоставить свой HTML в кодировке utf-8 (на самом деле, каждый должен делать это, я думаю!) Заголовок как:

Content-Type: text / html; кодировка = UTF-8

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

1 голос
/ 03 декабря 2014

Для удаления используйте:

$ column = str_replace ("\ xc2 \ xa0", '', $ column);

Кредиты среди прочих: Как удалить все вхождения c2a0 в строку с PHP?

0 голосов
/ 05 августа 2010

Если вы сохраните строку «Задача в размере 50 000 фунтов стерлингов» в двух разных столбцах типа данных, то есть поле «varchar» и «text».

Перед тем, как сохранить, я заменил символ на значение html equi, используя следующую функцию. str_replace ("& pound;", "£", $ title);

Вы найдете, что значение, хранящееся в текстовых полях, равно & pound, где, как и в varchar, его "Â £".

0 голосов
/ 02 июля 2009

Спасибо большое. Я подозревал, что mysql искажает символ фунта. Теперь все, что мне нужно сделать, это где бы ни генерировалась запись csv, просто используйте wrap их incov funciton. Хотя это хорошая работа, я счастлив, по крайней мере, кто-то точно показал, что делать. Я искренне ценю отображение предыдущих и новых значений 'header'. Это была большая помощь для меня.

-Марк

...