2010-10-22 12 views
1

A partir d'une base de données MySQL, je peux extraire les caractères UTF-8 suivants:PHP: Problèmes pour trouver le caractère le plus fréquent dans une chaîne UTF-8 (par exemple: 唐 犬 土 犬 家犬 尨 犬 山 山)?

"唐犬土用家犬尨犬山桑山犬巴戦師子幻日幻月引綱忠犬愛犬戌年成犬教条教義"

Je suis en train de trouver le personnage le plus fréquent dans cette chaîne. J'ai essayé de mettre chaque élément dans un tableau $ arr et de faire array_count_values ​​($ arr); Malheureusement les opérations de tableau (ou est print_r le coupable?) Produisent une sortie mal encodée comme ceci: [0] => � [1] => � [2] => � [3] => � Je peux afficher les caractères bien dans d'autres situations (ie récupérer de MySQL et afficher les caractères dans php fonctionne OK!), Mais le les fonctions de tableau (ou la sortie de tableau) semblent gâcher les choses. J'ai changé /etc/php5/apache2/php.ini
et mettre default_charset = "utf-8" là-dedans.

(et j'ai SET NAMES ... etc)

A) Où est le problème? B) Pourrais-je faire le travail sans avoir recours à des tableaux (c'est-à-dire en utilisant simplement la fonction de chaîne de caractères)?

Merci pour votre aide. Comment transformez-vous la chaîne en un tableau?

Répondre

0

PHP n'est pas multi-octets sûr par défaut, donc il est probablement divisé des caractères multi-octets au milieu. Rappelez-vous que les caractères UTF-8 sont de longueur variable.

Certains caractères sont un octet, certains sont deux, trois ou quatre. (Je pense que jusqu'à six est possible, en fait.) Vous auriez besoin d'un algorithme de séparation de chaînes très intelligent qui savait quand deux ou trois octets étaient un caractère, et les laisserait ensemble. En l'absence d'un tel algorithme, la solution la plus simple pourrait être de convertir votre chaîne en UTF-32. Maintenant, tous les caractères ont une longueur de quatre octets, vous pouvez diviser tous les quatre octets (pour les fonctions PHP simplistes, c'est-à-dire tous les quatre caractères, car PHP pense qu'un octet est un caractère).

La combinaison de signes diacritiques peut néanmoins poser problème (deux caractères Unicode constituant un caractère imprimable). Mais au moins, vous ne seriez pas cassé Unicode. Vous pourriez obtenir la DIALÉRIE COMBINANTE seule, mais ce n'est pas très cassé. Je ne suis pas sûr de la quantité de caractères Unicode qui s'appliquent aux langues d'Asie de l'Est. Je ne suis pas un expert Unicode.

+0

// Voici comment j'ai créé le tableau: while ($ r = mysql_fetch_array ($ resultat) ET $ i <10) {$ text. = $ R ['japanese']; $ i ++; } $ kanji = array(); pour ($ i = 0; $ i ajo

+0

'strlen()' compte les octets, pas les caractères. Et je ne trouve pas de documentation pour la construction '$ text [$ i]', mais je suis sûr que c'est la même chose. Les commentaires sur http://php.net/manual/fr/function.str-split.php donnent quelques conseils pour les chaînes Unicode. – TRiG

+0

$ text est ma variable chaîne, et $ text [$ i] me donne les caractères $ i-ième à ce moment-là (ce qui fonctionne avec les caractères ascii ...); Je vais essayer vos liens (et le faire dans mysql ...) – ajo