web-dev-qa-db-ja.com

UTF-8でエンコードされた文字列でstr_splitを使用する

現在、私はプロジェクトに取り組んでおり、通常のMySQLクエリを使用する代わりに、先に進んでPDOの使用方法を学習すると思いました。

出場者と呼ばれるテーブルがあり、データベース、テーブル、およびすべての列がutf-8にあります。競技者のテーブルに10個のエントリがあり、列「name」にはåäöなどの文字が含まれています。

これで、データベースからエントリを取得し、名前をvar_dumpすると、すべての特殊文字がそのままの文字列という良い結果が得られます。しかし、私がする必要があるのは、文字列を文字で分割し、配列に入れてからシャッフルすることです。

たとえば、次の文字列があります。TestÅÄÖTåän

また、str_splitを実行すると、配列内の独自のキーの各文字が取得されます。唯一の問題は、すべての特殊文字が次のように表示されることです:�、配列は次のようになることを意味します:

Array
(
    [0] => T
    [1] => e
    [2] => s
    [3] => t
    [4] =>  
    [5] => �
    [6] => �
    [7] => �
    [8] => �
    [9] => �
    [10] => �
    [11] =>  
    [12] => T
    [13] => �
    [14] => �
    [15] => �
    [16] => �
    [17] => n
)

ご覧のとおり、文字を台無しにするだけでなく、str_splitプロセスで文字を複製します。文字列を分割する方法をいくつか試しましたが、すべて同じ問題があります。分割する前に文字列を出力すると、特殊文字がうまく表示されます。

これは私のdbConn.phpコードです:

//設定ファイルが必要:require_once( 'config.inc.php');

// Start PDO connection:
$dbHandle = new PDO("mysql:Host=$dbHost;dbname=$dbName;charset=utf-8", $dbUser, $dbPass);
$dbHandle -> exec("SET CHARACTER SET utf8");

// Set error reporting:
$dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

そして、これは私がデータベースから取得してループするために使用するコードです:

// Require files:
require_once('dbConn.php');

// Get random artist:
$artist = $dbHandle->query("SELECT * FROM ".ARTIST_TABLE." WHERE id = 11 ORDER BY Rand() LIMIT 1");
$artist->setFetchMode(PDO::FETCH_OBJ);
$artist = $artist->fetch();
var_dump($artist->name);

// Split name:
$artistChars = str_split($artist->name);

私はutf-8で接続しています。私のphpファイルはutf-8 BOMなしであり、このページの他の特殊文字はこの問題を共有していません。何が間違っている可能性がありますか、または私は何を間違っていますか?

46
Jonathan

str_split はマルチバイト文字では機能せず、最初のバイトのみを返すため、文字が無効になります。 mb_split

12

接続文字列で使用されるutf8宣言が機能していないと報告されていることに注意してください。 php.netのコメントには、この代替案が頻繁に見られます。

$dbHandle = new PDO("mysql:Host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
152
Leo

UTF-8 PDOの使用

国際文字(中国語やタイ語も含む)をデータベースに書き込む際の問題

これを機能させる方法は他にもあります。私は専門家ではなく、単なる技術フリークであり、これらすべてを理解することに興味があります。 LinuxとWindowsでは、次のWebサイトのサンプルを使用して、いくつかのCMS(コンテンツ管理システム)をセットアップしました。

' http://www.elated.com/articles/cms-in-an-afternoon-php-mysql '

サンプルでは、​​挿入、更新、削除にPDOを使用しています。

解決策を見つけるのに数時間かかりました。私が何をしても、フォームとphpmyadmin/heidi -viewsのデータの違いを常に結論付けました。

https://mathiasbynens.be/notes/mysql-utf8mb4 」のヒントに従いましたが、まだ成功しませんでした

私のCMS構造には、ファイル「Config.php」があります。このWebページを読んだ後、行を変更しました

    define( 'DB_DSN', 'mysql:Host=localhost;dbname=mythings);

    define( 'DB_DSN', 'mysql:Host=localhost;dbname=mythings;charset=utf8');

これですべて正常に動作します。

10
MikeOffenbach

str_split関数は、文字ではなくバイトで分割されます。あなたは必要になるでしょう - mb_split

4
awm

私のためにこの作品...その有用性を願っています。

データベース、Apache、およびすべての構成がutf8にあったことを確認してください。

PDOオブジェクト

            $dsn = 'mysql:Host=' . Config::read('db.Host') . ';dbname=' . config::read('db.basename') .';charset=utf8'. ';port=' . Config::read('db.port') .';connect_timeout=15';
            $user = Config::read('db.user');
            $password = Config::read('db.password');
            $this->dbh = new PDO($dsn, $user, $password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
            $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

str_Word_countなどの別の関数を使用しない場合に機能します。

Str_Word_countを使用するには、utf8_decode(utf8_encode)を使用する必要があります。

function cortar($str)
{
    if (20>$count=str_Word_count($str)) {
        return $str;
    }
    else
    {
        $array = str_Word_count($str,1,'.,-0123456789()+=?¿!"<>*ñÑáéíóúÁÉÍÓÚ@|/%$#¡');
        $s='';
        $c=0;
        foreach ($array as $e) {
            if (20>$c) {
                if (19>$c) {
                $s.=$e.' ';
                }
                else
                {
                $s.=$e;
                }               
            }
            $c+=1;
        }
        return utf8_decode(utf8_encode($s));
    }
}

関数は20ワードの文字列を返します。

3
Strapicarus

PHP FUNCTIONSによるUTF-8の問題と解決策

1。UTF-8チャーターを保存する方法(数学的な文字列、92÷8÷2 =?のような特殊文字)?

回答$ string = utf8_encode('92÷8÷2 =? ');

2。データベースからUTF-8憲章を印刷する方法?

回答echo utf8_decode($ string);

注:エンコード/デコードを使用してこれを実行したくない場合は、経由で実行できます。

1. mysqli_query()を使用している場合

$conn = mysqli_connect('localhost','db_username','password','your_database_name');
mysqli_set_charset($conn,"utf8"); 

2. PDOを使用している場合

class Database extends PDO{
    function __construct() {
        parent::__construct("mysql:Host=localhost;dbname=your_db_name","gurutslz_root","Your_db_password",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
    }
}
$conn=new Database();
2

データベース構造内のテキストフィールドに問題があり、製品の説明を保存していました。フィールド設定をテキストではなくblobに設定して、問題を解決しました。

0
Michael Wegman