gpt4 book ai didi

icu - 如何在 webassembly 中构建和使用 libicu

转载 作者:行者123 更新时间:2023-12-04 20:04:42 24 4
gpt4 key购买 nike

我对 JavaScript 项目(在浏览器中)中的 ICU63 库的单词 iterator 感兴趣。因此,在阅读文档后,我相信 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.xml 吗?或者当我尝试编译我的包装器时是否可以链接 libicu?第二个选项看起来像是浪费数据,因为我对 lib 的大部分不感兴趣。

最佳答案

根据我的经验,处理库的最简单方法是使用 emconfigure 构建库。/emmake首先然后将它们与您自己的代码静态链接。像下面这样:

$ emcc your_wrapper.cpp \
your_compiled_libICU_static_lib.a \
-o result.js

使用 emconfigure 编译库/ emmake有时很困难,因为您可能需要修改源代码才能使其在 WebAssembly 中工作。

但是... 好消息 ! Emscripten 提供了一些流行且复杂的库的端口 and ICU is one of them .

您可以使用 -s USE_ICU=1 编译代码,而无需自己编译 ICU旗帜:
$ emcc your_wrapper.cpp \
-s USE_ICU=1 \
-s ERROR_ON_UNDEFINED_SYMBOLS=0 \
-std=c++11

需要注意的是,Emscripten ICU 端口是 ICU 62。因此您需要更改 using namespace icu_63;using namespace icu_62;

关于icu - 如何在 webassembly 中构建和使用 libicu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53880405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com