分割一个包含不同大小字符的字符串

时间:2019-05-30 12:09:10

标签: c++ c

我有一个输入字符串,其中包含不同大小的字符,例如const char * input = "aadđ€€¢¢"strlen的结果为15,这意味着虽然“ aad”仅占用3个字节,而其他特殊字符每个占2个字节或更多。

如何从该字符串的开头切出适合6个字节的字符?这意味着在这种情况下将仅使用“aadđ”,因为aadđ€将占用8个字节。

我尝试了普通的分割字符方法,但到目前为止没有一个有效。编辑:因为宽字符可能会在中间分裂,因此我会得到一些垃圾或其他字符。

3 个答案:

答案 0 :(得分:2)

您需要了解“字节”和“字符”之间的区别。

一个字节是计算机存储的最小单位,包含8位信息。字符(准确地说是Unicode代码点)是一个0到0x10FFFF的数字,由一个或多个字节表示,具体取决于所使用的编码。字符与某些“字形”相关联,“字形”是各种字体的一部分。

代码0到127的字符(通常称为“ ASCII字符”,但在技术上称为"C0 Controls and Basic Latin"块)被编码在一个字节中。这些包括英文字母,数字和一些标点符号。其余字符编码为多个字节。请查看UTF-8和UTF-16,以获取编码方式的一些示例。

要回答您的问题,给定示例中的字符串,您可以在字符串的开头剪切6个字节,但最后一个字节可能不代表有效字符。在UTF-8中,它将是一个“前缀”字节,后跟一到三个字节以构成一个完整的代码点。

答案 1 :(得分:0)

由于您没有描述遇到的问题,所以无法理解您的问题。但这应该可行。唯一的问题可能是,宽字符可能会在中间被拆分,您可能会得到不同的字符

char input2[7] = {0};
memcpy(input2, input, 6);

如果要获取wchar len,可以使用wcslen()

http://www.cplusplus.com/reference/cwchar/wcslen/

答案 2 :(得分:0)

strlen计算字节而不是字符。 要按字符顺序浏览字符串,可以尝试使用mblen,它会查看字符串中的下一个字符

std::setlocale(LC_ALL, "en_US.utf8");
const char *input = "aadđ€€¢¢";
int clen;
mblen(0, 0);
for (const char *p = input; *p != 0; p += clen) {
    clen = mblen(p, 4);
    std::cout << p << ", clen=" << clen << '\n';
}

要精确获取6个字节可能会很困难,因为这可能会停止在多字节字符中途

int len = 0, clen;
mblen(0, 0);
for (const char *p = input; *p != 0 && len < 6; p += clen, len += clen) {
    clen = mblen(p, 4);
}

char buf[10];
strncpy(buf, input, len);
buf[len] = 0;

一旦达到6个或更多个字节,此操作就会停止。

要获得最多6个字节,请在出现溢出的情况下减去复制前的最后一个字符

if (len > 6)
    len -= clen;