草庐IT

c++ - 我可以从语言首选项中获取代码页吗?

coder 2024-06-19 原文

Windows 似乎至少跟踪“当前语言环境”的四个维度: http://www.siao2.com/2005/02/01/364707.aspx

  • 默认用户区域设置
  • 默认系统区域设置
  • 默认用户界面语言
  • 默认输入区域

我的大脑很痛,只是试图跟踪四个不同的语言环境到底有什么用......

但是,我没有理解代码页和语言环境(或 LCID,或语言 ID)之间的关系,所有这些似乎都不一样(例如日语(日本)是 LANGID = 0x411位置代码 1,但日本的代码页是 932)。

在 Unicode 和窄字符串之间转换时,如何配置我们的应用程序以使用用户所需的语言作为默认 MBCS 目标?

也就是说,我们以前是一个MBCS应用。然后我们切换到 Unicode。事情在英语中运行良好,但在亚洲语言中失败,显然是因为 Windows 转换函数 WideCharToMultiByteMultiByteToWideChar 采用显式代码页(不是语言环境 ID 或语言 ID),这可以设置为 CP_ACP(默认为 ANSI 代码页),但似乎没有“默认为用户默认界面语言的代码页”的值。

我的意思是,这是一些非常复杂的废话。 “当前语言”的四个独立维度、三种不同的标识符类型,以及用于 C 库和 C++ 标准库的(不同的)字符串标识符。

在我们以前的 MBCS 构建中,磁盘 I/O 和用户 I/O 工作正常:一切都保留在默认系统区域(Windows XP 术语:“非 Unicode 程序的语言”)。但是现在,在我们的 UNICODE 构建中,所有内容都尝试使用“C”作为语言环境,并且文件 I/O 无法将 UNICODE 正确转码为用户的语言环境,反之亦然。

我们希望使用当前用户语言的代码页写出文本文件(当缩小时)。并且在读入时,当前用户语言的代码页应该转换回 UNICODE。

求助!!!

澄清:理想情况下,我希望使用 MUI 语言代码页而不是操作系统默认代码页。 GetACP() 返回系统默认代码页,但我不知道返回用户选择的 MUI 语言的函数(如果未指定/安装 MUI,它会自动恢复为系统默认值)。

最佳答案

我同意 Jon Trauntvein 的评论,GetACP 功能确实反射(reflect)了用户在控制面板中的语言设置。此外,根据您提供的“全部整理”博客的链接,默认用户界面语言是 Windows 用户界面将使用的语言,它与程序使用的语言不同。

但是,如果您真的想使用 DEFAULT USER INTERFACE LANGUAGE,则可以通过调用 GetUserDefaultUILanguage 获取它,然后您可以使用下表将语言 ID 映射到代码页。 Language Identifiers and Locales

您也可以使用 GetLocaleInfo 函数进行映射,但首先您必须将从 GetUserDefaultUILanguage 获得的语言 ID 转换为语言环境 ID,然后我想您会得到代码页的名称而不是数值,但您可以试试看。

关于c++ - 我可以从语言首选项中获取代码页吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18319869/

有关c++ - 我可以从语言首选项中获取代码页吗?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  6. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  9. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  10. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

随机推荐