2010-02-23 9 views
6

Je dois prendre une chaîne de caractères asiatiques mixtes (pour l'instant, supposons seulement kanji chinois ou japonais kanji/hiragana/katakana) et "Alphanumérique" (ie , Enlgish, French), et comptez-le de la façon suivante:en utilisant javascript, comment puis-je compter un mélange de caractères asiatiques et mots anglais

1) comptez chaque caractère asiatique comme 1; 2) comptez chaque MOT alphanumérique comme 1;

quelques exemples:

株式会社 MyCompany = 4 caractères + 1 mot = 5 au total 株式会社 Afficher la イ コ = 7 caractères


ma seule idée est à ce jour à utiliser:

var wordArray=val.split(/\w+/); 

puis de vérifier chaque élément pour voir si son contenu est alphanumérique (comptez donc 1) ou non (prenez donc la longueur du tableau). Mais je ne pense pas que ce soit vraiment très intelligent et le texte compté pourrait être jusqu'à 10.000 mots, donc pas très rapide.

Des idées?

+0

Vous ne pouvez pas distinguer un caractère asiatique d'autres caractères codés sur plusieurs octets. – shinkou

+2

Bien sûr, vous pouvez. Ils ont des valeurs différentes, après tout. – Annabelle

+1

Merci à tous. Nous avons en fait choisi: var charArray = val.match (/ \ w + | [^., \ UFF10- \ uFF19, \ uFF9E, \ uFF9F]/g); alert (charArray.length); Nous n'étions pas intéressés par le nombre de mots asiatiques, nous avions besoin du nombre de caractères plus le nombre de mots alphanumériques. Nous aurons besoin d'ajouter quelques codes d'exclusion, je pense, mais c'est un bon début. – user224513

Répondre

-2

Je pense que vous voulez boucler tous les caractères, et augmenter un compteur chaque fois que le caractère actuel est dans un mot différent (selon votre définition) que le précédent.

-1

Vous pouvez itérer sur chaque caractère du texte, en examinant chacun d'eux pour rechercher les ruptures de mots. L'exemple suivant le fait, en comptant chaque idéogramme chinois/japonais/coréen (CJK) comme un seul mot, et en traitant toutes les chaînes alphanumériques comme des mots simples.

Quelques notes sur ma mise en œuvre:

  1. Il ne gère pas probablement des caractères accentués correctement. Ils vont probablement déclencher des ruptures de mots. Vous pouvez modifier le wordBreakRegEx pour résoudre ce problème.

  2. cjkRegEx n'inclut pas certaines des plages de points de code les plus ésotériques, car ils nécessitent 5 chiffres hexadécimaux pour référencer et le moteur de regex de JavaScript ne semble pas vous laisser faire cela. Mais vous n'avez probablement pas besoin de vous en préoccuper, car je ne pense même pas que la plupart des polices les incluent. J'ai délibérément laissé japonais Hiragana et Katakana sur cjkRegEx, puisque je ne sais pas comment vous voulez gérer ces. Selon le type de texte que vous traitez, il peut être plus judicieux de traiter les chaînes comme des mots simples. Dans ce cas, vous devez ajouter une logique pour reconnaître le mot "kana" par rapport à un "mot alphanumérique". Si vous ne vous souciez pas, alors vous avez juste besoin d'ajouter leurs plages de points de code à cjkRegEx. Bien sûr, vous pouvez essayer de reconnaître les sauts de mots dans les cordes kana, mais cela devient rapidement très dur.

mise en œuvre Exemple:

function getWordCount(text) { 
    // This matches all CJK ideographs. 
    var cjkRegEx = /[\u3400-\u4db5\u4e00-\u9fa5\uf900-\ufa2d]/; 

    // This matches all characters that "break up" words. 
    var wordBreakRegEx = /\W/; 

    var wordCount = 0; 
    var inWord = false; 
    var length = text.length; 
    for (var i = 0; i < length; i++) { 
    var curChar = text.charAt(i); 
    if (cjkRegEx.test(curChar)) { 
     // Character is a CJK ideograph. 
     // Count it as a word. 
     wordCount += inWord ? 2 : 1; 
     inWord = false; 
    } else if (wordBreakRegEx.test(curChar)) { 
     // Character is a "word-breaking" character. 
     // If a word was started, increment the word count. 
     if (inWord) { 
     wordCount += 1; 
     inWord = false; 
    } else { 
     // All other characters are "word" characters. 
     // Indicate that a word has begun. 
     inWord = true; 
    } 
    } 

    // If the text ended while in a word, make sure to count it. 
    if (inWord) { 
    wordCount += 1; 
    } 

    return wordCount; 
} 

Le Unihan Database est très utile pour l'apprentissage de CJK en unicode. Aussi, bien sûr, le Unicode home page a beaucoup d'informations.

+0

Pas très utile sauf par exemple pseudocode. 1) L'exemple de mise en œuvre manque un crochet de fermeture à la fin de la boucle for, le brisant entièrement. 2) Si vous corrigez cela, cela ne compte pas les mots anglais. 3) Il ne compte pas non plus les mots japonais parce que l'auteur a omis Hiragana et Katakana. – fotoflo

3

Malheureusement, RegExp de JavaScript ne supporte pas les classes de caractères Unicode; \w s'applique uniquement aux caractères ASCII (modulo certains bogues de navigateur).

Vous pouvez toutefois utiliser des caractères Unicode dans des groupes, vous pouvez donc le faire si vous pouvez isoler chaque ensemble de caractères qui vous intéresse en tant que plage. par exemple .:

var r= new RegExp(
    '[A-Za-z0-9_\]+|'+        // ASCII letters (no accents) 
    '[\u3040-\u309F]+|'+       // Hiragana 
    '[\u30A0-\u30FF]+|'+       // Katakana 
    '[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF]', // Single CJK ideographs 
'g'); 

var nwords= str.match(r).length; 

(Cette tente de donner un compte plus réaliste des « mots » pour le japonais, en comptant chaque passage d'un type de kana comme un mot. C'est toujours pas droit, bien sûr, mais il est probablement plus proche plutôt que de traiter chaque syllabe comme un seul mot.)

De toute évidence, il y a beaucoup plus de caractères qui devraient être pris en compte si vous vouliez le faire correctement. Espérons que vous n'avez pas de personnages en dehors du plan multilingue de base, pour un!

Questions connexes