【发布时间】:2019-05-21 16:01:13
【问题描述】:
我对 JavaScript 项目(在浏览器中)中的 ICU63 库的单词迭代器感兴趣。所以在阅读文档后,我相信ICU默认使用UTF-16,这与JS相同,它可以避免我将JS字符串编码成其他东西。
第一步是用我需要的唯一功能构建一个包装器(我还不知道它是否有效):
#include "emscripten.h"
#include <string.h>
#include <unicode/brkiter.h>
#include <unicode/unistr.h>
#include <unicode/errorcode.h>
using namespace icu_63;
EMSCRIPTEN_KEEPALIVE
int splitWords(const char *locale, const uint16_t *text, uint16_t *splitted) {
//Note that Javascript is working in UTF-16
//icu::
UnicodeString result = UnicodeString();
UnicodeString visibleSpace = UnicodeString(" ");
int32_t previousIdx = 0;
int32_t idx = -1;
//Create a Unicode String from input
UnicodeString uTextArg = UnicodeString(text);
if (uTextArg.isBogus()) {
return -1; // input string is bogus
}
//Create and init the iterator
UErrorCode err = U_ZERO_ERROR;
BreakIterator *iter = BreakIterator::createWordInstance(locale, err);
if (U_FAILURE(err)) {
return -2; // cannot build iterator
}
iter->setText(uTextArg);
//Iterate and store results
while ((idx = iter->next()) != -1) {
UnicodeString word = UnicodeString(uTextArg, idx, idx - previousIdx);
result += word;
result += visibleSpace;
previousIdx = idx;
}
result.trim();
//The buffer contains UTF-16 characters, so it takes 2 bytes per point
memcpy(splitted, result.getBuffer(), result.getCapacity() * 2);
return 0;
}
它可以编译并且看起来不错,只是在尝试链接时缺少符号,因为我不知道如何继续。
LibICU 看起来需要大量内置数据。就我而言,频率表对于使用迭代器这个词是强制性的。
我是否应该尝试将我的包装器复制到源文件夹并尝试弄清楚如何使用 emconfigure。或者当我尝试编译我的包装器时是否可以链接 libicu?第二个选项看起来像浪费数据,因为我对库的大部分不感兴趣。
【问题讨论】:
标签: icu webassembly