如何从文件内容定义多行std::wstring?
问题与解决方案
问题场景
我需要将多字节文件内容存入std::wstring,后续用ofstream输出。普通宽字符串拼接写法都能正常工作,但使用**宽原始字符串字面量(LR"DELIM(...)"DELIM")**粘贴多字节内容时,编译器报错:
E0065 expected a ';'
E2452 ending delimiter for raw string not found
相关示例代码
可行写法
// 单个宽字符 std::wstring file_content=L"€"; // 多行宽字符串拼接 file_content=L"€" L"€" L"€"; // 无多字节内容的原始字符串 file_content=LR"SOMETHING(multiline with no issues)SOMETHING";
不可行写法
// 语法错误:多余的引号 file_content=L"€" L"€"" L"€";
报错原因
- 分隔符冲突:原始字符串的结束标记
)SOMETHING"如果出现在多字节文件内容中,编译器会误以为原始字符串提前结束,导致后续内容语法错误。 - 编码识别问题:如果源文件编码不是编译器默认识别的格式(比如UTF-8无BOM),多字节字符可能被编译器解析成乱码,破坏原始字符串的结构。
解决办法
使用独特的自定义分隔符
选择一个绝对不会出现在文件内容里的长序列作为分隔符,比如:file_content=LR"MY_LONG_UNIQUE_DELIM( 这里粘贴你的多字节文件内容 )MY_LONG_UNIQUE_DELIM";确保
)MY_LONG_UNIQUE_DELIM"这个组合在文件内容中完全不存在。调整源文件编码
在编译器中设置源文件编码为UTF-8带BOM(比如VS中通过「文件→高级保存选项」选择「UTF-8 带签名」),让编译器正确识别多字节字符。拆分原始字符串拼接
如果无法避免分隔符冲突,可以把多字节内容拆分成多个原始字符串片段拼接,就像普通宽字符串的写法:file_content=LR"DELIM(第一部分多字节内容)DELIM" LR"DELIM(第二部分多字节内容)DELIM";
内容的提问来源于stack exchange,提问作者O'con
相关产品推荐
相关产品推荐

