Fri Oct 24 02:07:51 JST 2014

In c++ addon (アドオン) on node.js, processing the utf8 (or unicode?) string

極小共通汎化を解く必要があって, 最長共通部分文字列のあの, O(mn)でやるDPと全く同様に解けた. これがめっちゃ遅くって, C++で書き直してた.

で, nodeが扱う文字列は無条件でutf-8 である. c++の内部でも, それをそのように扱う必要がある.

まったく、APIの名前が紛らわしい。 Write という名前も、WriteUtf8 という名前も。

今回、私が新しく学んだAPIについてのみ書く。

型チェック

v8::Value::IsString()

// Arguments& args
args[0]->IsString();

v8::String へのキャスト (Object#toString)

v8::Value::ToString()

// Arguments& args
Local<String> str = args[0]->ToString();

文字列長さの取得 (String#length)

v8::Value::Length()

// Arguments& args
int n = args[0]->Length();

変換をする前に、 String#length で長さを取得する必要がある。

c++ プリミティブ型へのキャスト

// Local<String> str
int n = str->Length();
uint16_t s[n];
str->Write(s);

Write はいわゆる sprinf である。 また、WriteAscii と、 WriteUtf8 もあるが、 今は使いどきではない。

c++ プリミティブ型から javascript 文字列へのキャスト

uint16_t s[14];
// assign into s[0] to s[12]
s[13] = 0; // last must be '\n'
Local<String> str = String::New(us));