有时在字符级别操作字符串是不可避免的。
在这里,我有一个为基于 ANSI/ASCII 的字符串编写的函数,它仅用 LF 替换 CR/LF 序列,也用 LF 替换 CR。我们使用这个是因为传入的文本文件通常有愚蠢的行尾,因为各种文本或电子邮件程序把它们弄得一团糟,我需要它们采用一致的格式,以使解析/处理/输出在未来正常工作。
对于每个字符的单个字节实现,这是从各种行尾到 LF 的这种压缩的相当有效的实现:
// returns the in-place conversion of a Mac or PC style string to a Unix style string (i.e. no CR/LF or CR only, but rather LF only)
char * AnsiToUnix(char * pszAnsi, size_t cchBuffer)
{
size_t i, j;
for (i = 0, j = 0; pszAnsi[i]; ++i, ++j)
{
// bounds checking
ASSERT(i < cchBuffer);
ASSERT(j <= i);
switch (pszAnsi[i])
{
case '\n':
if (pszAnsi[i + 1] == '\r')
++i;
break;
case '\r':
if (pszAnsi[i + 1] == '\n')
++i;
pszAnsi[j] = '\n';
break;
default:
if (j != i)
pszAnsi[j] = pszAnsi[i];
}
}
// append null terminator if we changed the length of the string buffer
if (j != i)
pszAnsi[j] = '\0';
// bounds checking
ASSERT(pszAnsi[j] == 0);
return pszAnsi;
}
我正在尝试将其转换为可以与多字节/unicode 字符串一起正常工作的东西,其中下一个字符的大小可以是多字节宽。
所以:
- 我只需要在有效的字符点(而不是字符的中间)查看字符
- 我需要正确复制被拒绝部分的字符部分(即复制整个字符,而不仅仅是字节)
我知道 _mbsinc() 会给我一个真实字符的下一个开始的地址。但是 Unicode (UTF16) 的等价物是什么,是否已经存在能够复制完整字符的原语(例如 length_character(wsz))?