как обнаружить и зафиксировать кодировку символов в mysql базе данных через php?

Метод сортировки и метод XOR имеют ту же временную сложность. Метод XOR только O (n), если Вы предполагаете, что поразрядный XOR двух строк является постоянной операцией времени. Это эквивалентно высказыванию, что размер целых чисел в массиве ограничен константой. В этом случае можно использовать вид Основания для сортировки массива в O (n).

, Если числа не ограничены, то поразрядный XOR занимает время O (k), где k является длиной строки битов, и метод XOR берет O (nk). Теперь снова вид Основания отсортирует массив вовремя O (nk).

6
задан pixeline 1 October 2009 в 18:57
поделиться

4 ответа

It's not completely clear from the question what character-encoding lens you're currently looking through (this depends on the defaults of your text editor, browser headers, database configuration, etc), and what character-encoding transformations the data has gone through. It may be that, for example, by tweaking a database configuration everything will be corrected, and that's a lot better than making piecemeal changes to data.

It looks like it might be a problem of utf8 double-encoding, and if that's the case, both the original and the corrupted data will be in utf8, so encoding detection won't give you the information you need. The approach in that case requires making assumptions about what characters can reasonably turn up in your data: as far as PHP and Mysql are concerned "é" is perfectly legal utf8, so you have to make a judgement based on what you know about the data and its authors that it must be corrupted. These are risky assumptions to make if you're just a technician. Luckily, if you know the data is in French and there's only 3000 records, it's probably ok to make those kinds of assumptions.

Below is a script that you can adapt first of all to check your data, then to correct it, and finally to check it again. All it's doing is processing a string as utf8, breaking it into characters, and comparing the characters against a whitelist of expected French characters. It signals a problem if the string is either not in utf8 or contains characters that aren't normally expected in French, for example:

PROBABLY OK     Côte d'Azur
HAS NON-WHITELISTED CHAR        Côte d'Azur    195,180 ô
NON-UTF8        C�e d'Azur

Here's the script, you'll need to download the dependent unicode functions from http://hsivonen.iki.fi/php-utf8/

<?php

// Download from http://hsivonen.iki.fi/php-utf8/
require "php-utf8/utf8.inc";

$my_french_whitelist = array_merge(
  range(0,127), // throw in all the lower ASCII chars
  array(
    0xE8, // small e-grave
    0xE9, // small e-acute
    0xF4, // small o-circumflex
    //... Will need to add other accented chars,
    // Euro sign, and whatever other chars
    // are normally expected in the data.
  )
);

// NB, whether this string literal is in utf8
// depends on the encoding of the text editor
// used to write the code
$str1 = "Côte d'Azur";
$test_data = array(
  $str1,
  utf8_encode($str1),
  utf8_decode($str1),
);

foreach($test_data as $str){
  $questionable_chars = non_whitelisted(
    $my_french_whitelist,
    $str
  );
  if($questionable_chars===true){
    p("NON-UTF8", $str);
  }else if ($questionable_chars){
    p(
      "HAS NON-WHITELISTED CHAR",
      $str,
      implode(",", $questionable_chars),
      unicodeToUtf8($questionable_chars)
    );
  }else{
    p("PROBABLY OK", $str);
  }
}

function non_whitelisted($whitelist, $utf8_str){
  $codepoints = utf8ToUnicode($utf8_str);
  if($codepoints===false){ // has non-utf8 char
    return true;
  }
  return array_diff(
    array_unique($codepoints),
    $whitelist
  );
}


function p(){
  $args = func_get_args();
  echo implode("\t", $args), "\n";
}
6
ответ дан 10 December 2019 в 00:41
поделиться

Я думаю, вы можете использовать более компилятивный подход. Несколько недель назад я получил болгарскую базу данных, которая была динамически закодирована в БД, но при перемещении ее в другую базу данных я получил напуганный ???

Я решил это путем сброса базы данных, установив для нее значение utf8. сопоставление с последующим импортом данных как двоичных. Это автоматически преобразовало все в utf8 и больше не дало мне ???.

Это было в MySQL

2
ответ дан 10 December 2019 в 00:41
поделиться

Как вы сказали, ваши данные иногда конвертируются с использованием utf8_encode , ваши данные кодируются либо с помощью UTF-8, либо с помощью ISO 8859-1 (с utf8_encode преобразует ISO 8859-1 в UTF-8). А поскольку UTF-8 кодирует символы от 128 до 255 двумя байтами, начиная с 1100001x, вам просто нужно проверить, верны ли ваши данные UTF-8, и преобразовать их, если нет.

Так что просканируйте все свои данные, если они уже есть UTF-8 (см. Несколько функций is_utf8 ) и используйте utf8_encode , если это не UTF-8.

0
ответ дан 10 December 2019 в 00:41
поделиться

Моя проблема в том, что каким-то образом я получил в своей базе данных такие символы, как à, é, ê в простом формате или в кодировке utf8. После расследования я пришел к выводу, что какой-то браузер (я не знаю IE, FF или другой) кодирует представленные входные данные, поскольку для обработки форм отправки намеренно не добавлена ​​кодировка utf8. Итак, если я буду читать данные с помощью utf8_encode, я изменю другие простые символы, и наоборот.

Мое решение после изучения решений, приведенных выше: 1. Я создал новую базу данных с кодировкой utf8 2. Импортировал базу данных ПОСЛЕ того, как я изменил определение кодировки в операторе CREATE TABLE в файле дампа sql с Latin .... на UTF8. 3. импортировать данные из исходной базы данных (пока здесь, возможно, будет достаточно просто изменить кодировку для существующих db и таблиц, и это только в том случае, если исходный db не является utf8) 4. обновить содержимое в базе данных напрямую, заменив символы в кодировке utf8 обычным форматом, например

UPDATE `clients` SET `name` = REPLACE(`name`,"é",'é' )  WHERE `name` LIKE CONVERT( _latin1 '%é%' USING utf8 ); 
  1. . Я вставил эту строку в класс db (для кода php), чтобы убедиться, что это связь UTF8

    $ this- > query ('SET CHARSET UTF8');

Итак, как обновить? (шаг 4) Я построил массив с возможными символами, которые могут быть закодированы

$special_chars = array(
  'ù','û','ü',
  'ÿ',
  'à','â','ä','å','æ',
  'ç',
  'é','è','ê','ë',
  'ï','î',
  'ô','','ö','ó','ø',
  'ü');

Я создал массив с парами таблиц и полей, которые должны быть обновлены

$where_to_look = array(
    array("table_name" , "field_name"),
        ..... );

, чем,

    foreach($special_chars as $char)
    {
      foreach($where_to_look as $pair)
      {
        //$table = $pair[0]; $field = $pair[1]
        $sql = "SELECT id , `" . $pair[1] . "` FROM " .$pair[0] . " WHERE `" . $pair[1] . "` LIKE CONVERT( _latin1 '%" . $char . "%' USING utf8 );";

    if($db->num_rows() > 0){
         $sql1 = "UPDATE " . $pair[0] . " SET `" . $pair[1] . "` = REPLACE(`" . $pair[1] . "`,CONVERT( _latin1 '" . $char . "' USING utf8 ),'" . $char . "' )  WHERE `" . $pair[1] . "` LIKE CONVERT( _latin1 '%" . $char . "%' USING utf8 )";
         $db1->query($sql1);
        }
    }
 }

Основная идея - использовать функции кодирования mysql чтобы избежать кодирования между mysql, apache, browser и обратно; ПРИМЕЧАНИЕ: у меня не было доступных функций php, таких как mb _....

Best

0
ответ дан 10 December 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: