作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设有一段代码是这样的:
my $str = 'some text';
my $result = my_subroutine($str);
和 my_subroutine()
应该作为 Perl XS 代码来实现。例如,它可以返回 (unicode) 字符串的字节总和。
在XS代码中,如何处理一个字符串(a)一个字符,作为一个通用的方法,(b)一个字节一个字节,如果字符串由 ASCII 码子集组成(将 string 的 native 数据结构转换为 char[] 的内置函数)?
最佳答案
在 XS 层,您将获得字节或 UTF-8 字符串。在一般情况下,您的代码可能包含一个 char *
以指向字符串中的下一项,并随着它的增加而递增。要在 XS 中使用一组有用的 UTF-8 支持函数,请阅读 "Unicode Support" perlapi
我的例子来自 http://cpansearch.perl.org/src/PEVANS/Tickit-0.15/lib/Tickit/Utils.xs
int textwidth(str)
SV *str
INIT:
STRLEN len;
const char *s, *e;
CODE:
RETVAL = 0;
if(!SvUTF8(str)) {
str = sv_mortalcopy(str);
sv_utf8_upgrade(str);
}
s = SvPV_const(str, len);
e = s + len;
while(s < e) {
UV ord = utf8n_to_uvchr(s, e-s, &len, (UTF8_DISALLOW_SURROGATE
|UTF8_WARN_SURROGATE
|UTF8_DISALLOW_FE_FF
|UTF8_WARN_FE_FF
|UTF8_WARN_NONCHAR));
int width = wcwidth(ord);
if(width == -1)
XSRETURN_UNDEF;
s += len;
RETVAL += width;
}
OUTPUT:
RETVAL
简而言之,此函数一次迭代一个 Unicode 字符的给定字符串,累积 wcwidth()
给定的宽度。
关于c - 如何在 XS 代码中逐个字符地处理字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10622588/
我尝试在 d3.js 中进行链式转换。为此,我在数组中定义了一组转换,并(尝试)创建一个函数以使用 .each("end", function()) 递归调用它们,以在前一个为完成,但我还没有结果。
我是一名优秀的程序员,十分优秀!