Проверьте, если CSV-файл в UTF-8 с PHP - PullRequest
0 голосов
/ 18 января 2012

Есть ли способ, который проверяет CSV-файл для UTF-8 без кодировки BOM? Я хочу проверить весь файл, а не одну строку.

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

Google только показал мне это . Но ссылка в последнем сообщении недоступна.

Ответы [ 2 ]

8 голосов
/ 18 января 2012
if (mb_check_encoding(file_get_contents($file), 'UTF-8')) {
    // yup, all UTF-8
}

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

4 голосов
/ 18 января 2012

Я рекомендую эту функцию (из набора инструментов Symfony):

<?php
  /**
   * Checks if a string is an utf8.
   *
   * Yi Stone Li<yili@yahoo-inc.com>
   * Copyright (c) 2007 Yahoo! Inc. All rights reserved.
   * Licensed under the BSD open source license
   *
   * @param string
   *
   * @return bool true if $string is valid UTF-8 and false otherwise.
   */
  public static function isUTF8($string)
  {
    for ($idx = 0, $strlen = strlen($string); $idx < $strlen; $idx++)
    {
      $byte = ord($string[$idx]);

      if ($byte & 0x80)
      {
        if (($byte & 0xE0) == 0xC0)
        {
          // 2 byte char
          $bytes_remaining = 1;
        }
        else if (($byte & 0xF0) == 0xE0)
        {
          // 3 byte char
          $bytes_remaining = 2;
        }
        else if (($byte & 0xF8) == 0xF0)
        {
          // 4 byte char
          $bytes_remaining = 3;
        }
        else
        {
          return false;
        }

        if ($idx + $bytes_remaining >= $strlen)
        {
          return false;
        }

        while ($bytes_remaining--)
        {
          if ((ord($string[++$idx]) & 0xC0) != 0x80)
          {
            return false;
          }
        }
      }
    }

    return true;
  }

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

<?php
$handle = fopen("mycsv.csv", "r");
$check_string = "";
$line = 1;
if ($handle) {
    while ((($buffer = fgets($handle, 4096)) !== false) && $line < 11) {
        $check_string .= $buffer;
        $line++;
    }
    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);

    var_dump( self::isUTF8($check_string) );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...