字符串转换函数的问题

Concern of a string conversion function

本文关键字:问题 函数 转换 字符串      更新时间:2023-10-16

我做了一个从专有文本格式到带有转义unicode代码点的简单文本字符串的转换函数(格式为`\uXXXX',其中XXXX是十六进制格式的unicode代码点)。

int wchar_to_utf16(wchar_t* strIn, char* strOut, int max_buf_len);

在这个函数中,我传递指向要转换的字符串的指针、指向目标缓冲区(将在其中写入转换后的字符串)的指针以及该缓冲区的长度。

在函数内部,到处都是缓冲区绑定检查,如果空间不够,函数将返回1,否则返回0。

我的问题是:我的函数关心的是知道缓冲区长度并执行检查,还是最好删除长度参数并对调用方进行检查?问题:最小缓冲区长度只能通过查看输入字符串并了解编码(这不应该是调用方关心的问题)来确定

您可以通过整个输入字符串来确定输出字符串所需的长度,然后分配该数量,然后进行转换。这样,您就不需要调用方指定"最大"长度,而调用方可能会猜错(然后呢?)。缺点是必须对整个输入字符串进行两次检查。

另一方面,调用方可能已经知道输入字符串的字符长度,例如通过调用wcslen,这对调用方来说并不太期望,所以如果这些信息对于您的函数来说足够,那么是的,让调用方提供它,他们可以计算一次,并在再次需要时保留这个数字(以避免每次都遍历整个输入字符串)。如果这些信息还不够(我不能确定,因为我没有完全理解这个问题),那么不要期望最大缓冲区大小,因为这会暴露实现细节(当函数期望字符串的字符长度时,情况并非如此)。

如果您对公开实现细节很满意,那么最大缓冲区大小可能会起作用,但话说回来,如果调用者猜错了大小,您会怎么办?转换所有浪费空间的东西?因为整个东西不合适而转换一点?如果您想要一个隐藏实现的干净接口,那么您可以自己计算缓冲区大小,除非您可以合理地期望调用者提供任何信息(例如字符串的长度)。

编辑:

您可以编写一个名为wchar_to_utf16_calc_len的函数,该函数接收wchar_t *,并计算存储转换字符串的缓冲区的理想长度,而不需要实际分配任何内容。然后,调用者可以分配具有理想长度的缓冲区,并将缓冲区传递给转换函数。

此设置要求调用方对编码的了解不超过使用wchar_to_utf16函数所需的信息(如果我弄错了,请纠正我),因为缓冲区将保证足够大(假设调用方正确记住使用此长度计算函数),因此无需在转换函数中进行边界检查,您将不必在转换函数内分配缓冲区,因为调用者将知道要分配多大的数组。这样就不需要长度参数了。