Windows 代码页与标准 C/C++ 文件名交互?

2023-11-27

客户抱怨我们的代码过去常常写入文件名中包含日语字符的文件,但现在不再适用于所有情况。我们一直只是使用良好的旧 char * 字符串来表示文件名,所以它曾经起作用让我有点震惊,而且我们没有做任何我知道应该让它停止工作的事情。我让他们向我发送了一个文件,其中嵌入了从我们的软件导出的文件名,看起来这些字符串使用十六进制字符 82 和 83 作为双字节序列的第一个字符来表示日语字符。在网上查了一下,我相信这可能是 SHIFT_JIS 和/或 Windows 代码页 932。

在我看来,之前发生的事情是 fopen 和 ofstream::open 使用此代码页接受的文件名;现在只有 fopen 可以。我检查了 Visual Studio fopen 文档,没有看到任何关于如何将可接受的字符串传递给 fopen 的提示。

从短期来看,我希望有人能为我阐明特定的 Windows fopen 与 ofstream::open 问题。从长远来看,我真的很想知道在 Windows、Linux 和 OS X 上用 C++ 打开 Unicode(和其他?)文件名的可接受方式。

编辑添加:我相信工作的打开是在“C”区域设置中完成的,而不起作用的打开是在客户的默认区域设置中完成的。然而,这种情况已经存在多年了,而且该程序的旧版本至今仍然可以在他们的系统上运行,因此这似乎不太可能解释我们所看到的问题。

更新:我向客户发送了一个小测试程序。已验证 fopen 对于 SHIFT_JIS 文件名可以正常工作,而 std::ofstream 则不能。这是在 Visual Studio 2005 中,无论我使用默认区域设置还是“C”区域设置,都会发生这种情况。

我仍然很感兴趣是否有人对这种行为有解释(以及为什么它神秘地改变了——也许是 VS2005 的服务包?),并希望整合一个全面的“最佳实践”来在可移植的 C++ 代码中处理 Unicode 文件名。


像 fopen 或 ofstream::open 这样的函数将文件名视为 char *,但这会被解释为位于系统代码页中。

这意味着它可以是表示为 Shift-JIS (cp932) 的日语字符,也可以是简体中文 (Big 5/cp936)、韩语、阿拉伯语、俄语,只要您能想到的都可以(只要它与操作系统代码页匹配)。

这也意味着它只能在日语系统上使用日语文件名。 更改系统代码页,应用程序“停止工作” 我怀疑这就是这里发生的情况(自 Win 2000 以来 Windows 在这方面没有大的变化)。

这是更改系统代码页的方法:http://www.mihai-nita.net/article.php?artID=20050611a

从长远来看,您可能会考虑转向 Unicode(并使用 _wfopen、wofstream)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 代码页与标准 C/C++ 文件名交互? 的相关文章

随机推荐

  • 从 json 创建 DynamoDB 表

    我想知道是否可以从表定义 json 本身创建 dynamodb 表 我研究了 aws cli 工具 但找不到任何方法来执行此操作 只是想知道是否可能 aws dynamodb create table file tabledenifisio
  • 如何将 mySql SQL 脚本转换为 MS SQL 脚本?

    我必须将客户 MySql 数据库架构 数据迁移到 MS SQL SERVER 2008 最后我收到了 70 Mb SQL 文件 其中包含与 MSSQL 不兼容的 mySQL 方言 DROP TABLE IF EXISTS kladr CRE
  • Facebook 登录与 CSRF 状态令牌不匹配的问题

    我做了一些搜索 但没有找到与我的问题相关的任何内容 我目前正在尝试对我的网站实施 Facebook 登录 但由于 htaccess mod 重写 URL 我在登录身份验证方面遇到了问题 该代码工作完美 如果我在没有 mod 重写规则的情况下
  • c从 R 中的字符串绑定动态列名

    我想将一列绑定到数据框 并使用从字符串动态分配的列名称 y attribute Survived cbind test data y attribute NA 这会导致新列添加为y attribute而不是所需的Survived属性以字符串
  • Mockito 空指针异常

    我遵循了 hoaz 的建议 但是 我遇到了空指针异常 RunWith MockitoJUnitRunner class public class GeneralConfigServiceImplTest InjectMocks privat
  • Perl 可以“静态”解析吗?

    An 文章名为 Perl 无法解析 形式化证明 正在巡视 那么 Perl 是否在 运行时 或 编 译时 决定其解析代码的含义 在我读过的一些讨论中 我的印象是这些论点源于不精确的术语 所以请尝试在答案中定义您的技术术语 我故意没有定义 运行
  • 如何将列表中的随机值分配给 pandas 数据框中的列?

    我正在 Bigquery 中使用 Python 并且有一个大型数据帧 df 大约 700 万行 我还有一个列表 lst 包含一些日期 例如给定月份的所有日期 我正在尝试在 df 中创建一个附加列 random day 并使用每行中 lst
  • HTTPS 到 HTTPS 重定向 Nginx

    如何将一个 HTTPS 重定向到另一个 HTTPS 我只有一个域的一个 SSL 证书 例如 如何重定向https example org to https example com 我已经尝试搜索谷歌和其他论坛 但没有发现任何效果 这非常容易
  • openapi 3.0 有效的最小值和最大值

    我有下面的模式定义来表示commission amount在我的 openapi 合同中 commissionAmount type number minimum 99999 99 maximum 99999 99 生成的代码 Valid
  • 我可以从实例访问类变量吗?

    我有这门课 class ReallyLongClassName static var 5 def instance method self ReallyLongClassName static var 1 有没有办法使用 self 变量访问
  • 使用 javascript 保持事件

    我真的很想知道当您点击 在移动设备上 或单击 在桌面设备上 表单提交 锚点 等时是否有任何方法可以执行功能 并保持一段时间而不使用 jQuery function clicked set some kind of timer or so f
  • 对分组中的“汇总”进行排序

    我发现与 group by 一起使用的 with rollup 选项非常有用 但它不适用于 order by 子句 有什么办法可以按照我想要的方式订购并计算小计吗 CREATE TABLE mygroup id int 11 default
  • 如何在 MATLAB 中一步加载 100 个具有相似名称和/或字符串的文件?

    我的目录中有 100 个 ASCII 文件 全部命名如下 int 001 ASCint 002 ASCint 003 ASC int 099 ASCint 100 ASC 我必须使用 importdata 将它们全部导入到 MATLAB 中
  • 防范 CSRF 和 XSS(散列 + 加密)

    安全 如今 如果没有通过开发人员使用的框架或开发人员自己编程适当的安全性 任何应用程序都无法在互联网上生存 我目前正在开发一个 RESTful API 以使用 Bearer 令牌身份验证进行工作 但一直在阅读有关 XSS 和 CSRF 攻击
  • 在 Windows 上安装 Python Pillow

    我对 Python 相当陌生 并尝试在 Windows 7 上安装 Pillow 包 我从以下位置下载并运行了 MS Windows 安装程序 Pillow 2 2 1 win amd64 py3 3 exehere 它看起来安装得很好 如
  • 如何向 DataReader 添加列

    我的目标是从数据源检索数据 向其中添加一些元数据并将其插入到另一个目标 目标的架构比源多四列 计算列 我在用SQL批量复制 这需要一个具有所有列 包括计算出的 4 列 的阅读器 有没有办法手动将列添加到 DataReader 中 或者如果不
  • 将 MVC 迷你分析器计时纳入异步任务

    我在页面内有一个长时间运行的 SQL 查询 我通过使用异步任务加速了该查询 using System Threading Tasks var asyncTask new Task
  • zsh 中的 IFS 行为与 bash 不同

    foo local lines ls l local IFS n for line in lines do echo line done 在 zsh 中 循环只执行一次 因为 for 的输出ls l命令不会被新行分割 整个文本块都会传递到
  • 数组元素算作公共初始序列吗?

    有点相关我之前的问题 数组的元素算作公共初始序列吗 struct arr4 int arr 4 struct arr2 int arr 2 union U arr4 arr4 arr2 arr2 U u u arr4 arr 0 0 wri
  • Windows 代码页与标准 C/C++ 文件名交互?

    客户抱怨我们的代码过去常常写入文件名中包含日语字符的文件 但现在不再适用于所有情况 我们一直只是使用良好的旧 char 字符串来表示文件名 所以它曾经起作用让我有点震惊 而且我们没有做任何我知道应该让它停止工作的事情 我让他们向我发送了一个