Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用高/低代理计算java中的单词和字符?_Java_String_Count_Utf 16 - Fatal编程技术网

使用高/低代理计算java中的单词和字符?

使用高/低代理计算java中的单词和字符?,java,string,count,utf-16,Java,String,Count,Utf 16,我知道关于这个主题有一些这样的说法,但是所有的解决方案似乎都采用了一种不同于我在javascript中看到的一个例子的方法 下面是一个javascript示例,它统计文本字符串中键入的段落、句子、单词和字符,其中包括检查高/低替代项,以便具体计算字符数: javascript版本 count(text); function count(original) { var trimmed = original.replace(/[\u200B]+/, '').trim(); retu

我知道关于这个主题有一些这样的说法,但是所有的解决方案似乎都采用了一种不同于我在javascript中看到的一个例子的方法

下面是一个javascript示例,它统计文本字符串中键入的段落、句子、单词和字符,其中包括检查高/低替代项,以便具体计算字符数:

javascript版本

count(text);

function count(original) {
    var trimmed = original.replace(/[\u200B]+/, '').trim();
    return {
        paragraphs: trimmed ? (trimmed.match(/\n+/g) || []).length + 1 : 0,
        sentences: trimmed ? (trimmed.match(/[.?!…\n]+./g) || []).length + 1 : 0,
        words: trimmed ? (trimmed.replace(/['";:,.?¿\-!¡]+/g, '').match(/\S+/g) || []).length : 0,
        characters: trimmed ? _decode(trimmed.replace(/\s/g, '')).length : 0,
        all: _decode(original).length
    };
};

function _decode(string) {
    var output = [],
        counter = 0,
        length = string.length,
        value, extra;
    while (counter < length) {
        value = string.charCodeAt(counter++);
        if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
            // High surrogate, and there is a next character.
            extra = string.charCodeAt(counter++);
            if ((extra & 0xFC00) === 0xDC00) {
                // Low surrogate.
                output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
            } else {
                // unmatched surrogate; only append this code unit, in case the next
                // code unit is the high surrogate of a surrogate pair
                output.push(value, extra);
                counter--;
            }
        } else {
            output.push(value);
        }
    }
    return output;
}
计数(文本);
函数计数(原始){
var trimmed=原始。替换(/[\u200B]+/,'').trim();
返回{
段落:修剪?(修剪。匹配(/\n+/g)| |[])。长度+1:0,
句子:修剪?(修剪。匹配(/[.?!…\n]+//g)| |[])。长度+1:0,
单词:trimmed?(trimmed.replace(/[“;:,.?\-!]+/g.)。match(/\S+/g)| |[])。长度:0,
字符:修剪?\解码(修剪。替换(/\s/g')。长度:0,
全部:_解码(原始)。长度
};
};
函数_解码(字符串){
var输出=[],
计数器=0,
length=string.length,
价值,额外;
while(计数器<长度){
value=string.charCodeAt(计数器++);

如果(value>=0xD800&&value因此,javascript版本所做的是,如果代理项对出现在正在解码的文本中,则将其作为一个字符进行读取。这在javascript中是可能的,因为根据javascript引擎的不同,允许使用代理项,并且UTF-16支持高代理项,这意味着使用到代码点对单个可见字符进行编码s、 为了正确计算长度,库会考虑额外的代码点,因此它们会被计算为一个

在Java中,您也会遇到类似的问题,除了在Java中,您可以有更多的编码方案。幸运的是,Java已经为包含高代理项的字符串返回了正确的长度。但是,如果您想分离组合的代码点,甚至删除它们,Java提供了(从文本中)的

string=Normalizer.normalize(string,Normalizer.Form.NFD);


因此,javascript版本所做的是,如果代理项对出现在正在解码的文本中,则将其作为一个字符读取。这在javascript中是可能的,因为根据javascript引擎的不同,允许使用代理项,并且UTF-16支持高代理项,这意味着使用代码点对单个可见字符进行编码。要计算长度正确地说,库会考虑额外的代码点,因此它们被计算为一个

在Java中,您也会遇到类似的问题,除了在Java中,您可以有更多的编码方案。幸运的是,Java已经为包含高代理项的字符串返回了正确的长度。但是,如果您想分离组合的代码点,甚至删除它们,Java提供了(从文本中)的

string=Normalizer.normalize(string,Normalizer.Form.NFD);