gpt4 book ai didi

c - 如何在 XS 代码中逐个字符地处理字符串

转载 作者:太空狗 更新时间:2023-10-29 16:08:41 24 4
gpt4 key购买 nike

假设有一段代码是这样的:

  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/

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