我正致力于在 C 和 C++ 中实现不同的 API,并且想知道有哪些技术可用于避免客户端在从框架接收字符串或将它们传回时出现编码错误。例如,想象一个简单的 C++ 插件 API,客户可以实现它来影响翻译。它可能具有这样的功能:
const char *getTranslatedWord( const char *englishWord );
现在,假设我想强制所有字符串都以 UTF-8 格式传递。当然我会记录这个要求,但我希望编译器强制执行正确的编码,也许通过使用专用类型。例如,像这样:
class Word {
public:
static Word fromUtf8( const char *data ) { return Word( data ); }
const char *toUtf8() { return m_data; }
private:
Word( const char *data ) : m_data( data ) { }
const char *m_data;
};
我现在可以在 API 中使用这种特殊类型:
Word getTranslatedWord( const Word &englishWord );
不幸的是,这很容易变得非常低效。 Word
类缺少适当的复制构造函数、赋值运算符等。我想尽可能避免不必要的数据复制。此外,我看到了 Word
被越来越多的实用函数扩展的危险(比如 length
或 fromLatin1
或 substr
等),我宁愿不写 Yet Another String Class。我只想要一个避免意外编码混淆的小容器。
我想知道是否还有其他人对此有一些经验并可以分享一些有用的技术。
编辑:在我的特定情况下,API 在 Windows 和 Linux 上使用,使用 MSVC 6 - Windows 上的 MSVC 10 和 Linux 上的 gcc 3 & 4。
最佳答案
你可以传递一个 std::pair 而不是 char*:
struct utf8_tag_t{} utf8_tag;
std::pair<const char*,utf8_tag_t> getTranslatedWord(std::pair<const char*,utf8_tag_t> englishWord);
生成的机器代码在一个体面的现代编译器上应该是相同的,该编译器使用 std::pair 的空基类优化。
虽然我不介意这个。我只使用 char*s 并记录输入必须是 utf8。如果数据可能来自不受信任的来源,您将不得不在运行时检查编码。
关于c++ - 如何避免在 C/C++ API 中对字符串进行编码混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2881239/