从Local <string> </string>计算一行中的UTF8字符数

时间:2013-07-17 08:22:54

标签: c++ node.js

API参考:http://bespin.cz/~ondras/html/index.html

我需要计算一行中的字符数:

a b c d
e f g h

如果我知道所有字符都是ascii值,那么我可以这样做:

Local<String> str = ...
String::AsciiValue s (str->ToString ());
unsigned char c;

for (int i=0; (c = (*s)[i]) != 0; i++){
  //...
}

但字符串可以包含编码超过1个字节的字符:

↓ ↓ a b
↓ a b c

我无法将字符串转换为char *,因为在这种情况下以3个字节编码,每个字节一个字符,因此我的算法将添加3个字符而不是1个。

所以我需要获得子串。在javascrit很简单:

var s = "↓ ↓ a b";
var c;
for (var i=0; i<s.length; i++){
  c = s.substring (i, i + 1);
  //or c= s[i];
}

我需要在C ++中做同样的事情。

Local<String> str = ...

for (int i=0; i<str->Length (); i++){
  //???
  //Another alternative is to get the String of each position, something like this:
  //Local<String> s = str->Get (i);
}

2 个答案:

答案 0 :(得分:0)

假设您正在使用String::AsciiValue length()的实施,似乎有一个{{1}}方法

答案 1 :(得分:0)

解决。

UTF8代码点:https://en.wikipedia.org/wiki/UTF-8

基本思想是屏蔽字节并检查必须忽略多少字节才能完全读取多字节字符。

unsigned char masks[5] = { 192, 224, 240, 248, 252 };

Local<String> str = ...
String::Utf8Value s (str->ToString ());
unsigned char c;
int utf8Bytes = 0;

for (int i=0; (c = (*s)[i]) != 0; i++){
    //Ignore utf8 check for one byte chars
    if (c > 127){
        if (utf8Bytes){
            utf8Bytes--;
            continue;
        }

        //Check whether is a utf8 multibyte char
        for (int i=4; i>=0; i--){
            if ((c & r->masks[i]) == r->masks[i]){
                utf8Bytes = i + 1;
                break;
            }
        }

        if (utf8Bytes){
             //Do something if it's a multibyte char
        }

        continue;
    }

        //Do something to check lines, chars, etc
}