问题标签 [boost-locale]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
file-io - 没有广泛 API 的可移植 UTF-8 接口(Windows 和 Unix)
我正在使用以下界面设置硬盘驱动器上文件的路径:
此路径将用于基本文件 I/O。
例如,如果我提供一个包含中文字符的路径(例如通过 QString::toUtf8()),这对于 Unix 来说很好,但对于 Windows 来说当然不行,因为内部使用了 wchar/wstring API。
我现在正在寻找一种优雅的方法来使这个接口 UTF-8 在基于 Windows 和 Unix 的系统上兼容。有没有办法避免在基于 Windows 的系统上使用广泛的 API 并继续使用 std::string 和 std::ofstream() ?
在查看 boost::locale 之后,这在我看来是一种处理 UTF-8 编码的可能性。这会是一种方法吗(例如,用 boost::ofstream() 对应物替换 std::ofstream ?)
感谢所有帮助。
c++ - 使用 iconv 为 iOS 构建 Boost.Locale
我目前正在尝试为 iOS 构建 Boost.Locale,但我无法找到 iconv 库(我正在为 iOS 成功构建 Boost 的其他部分,例如thread
或filesystem
)。
我试图让 Boost.Build 自己找到它,我试图将ICONV_PATH
变量设置为指向 iPhoneOS SDK iconv lib。检查 Boost.Locale 中的 Jamfile,我偶然发现了这条规则:
所以我认为设置-sICONV_PATH
就/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk/usr
足够了,因为这个目录包含一个lib
和一个include
包含 iconv 库和头文件的文件夹,但是 Boost 仍然找不到它,并吐出:
请注意,我总是b2
使用该--reconfigure
选项进行调用,因此它不是缓存先前调用的结果(在上面的列表中会有一个尾随(cached)
。
那么,有没有办法正确地将 Boost 指向 iOS SDK 中的 iconv 实现?如果可能的话,我想避免建立一个单独的 iconv。
c++ - stod 不能与 boost::locale 一起正常工作
我试图在逗号是小数点分隔符的德语语言环境中一起使用 boost::locale 和 std::stod 。考虑这段代码:
std::locale loc("") 创建正确的语言环境,输出为
正如我所料。当我注释掉第 (1) 行并取消注释第 (2) 行时,输出为
d2 的结果是意料之中的。据我了解 boost::locale 希望我明确指定 d2 应格式化为数字并执行
再次将输出固定为 2,2。问题是 std::stod 不再将 1,1 视为有效的浮点数并将其截断为 1。
我的问题是:为什么当我使用 boost::locale 生成我的语言环境时 std::stod 停止工作?
附加信息:我使用的是 VC++2015,Boost 1.60,没有 ICU,Windows 10
更新:
我注意到,当我两次设置全局语言环境时,问题已得到解决,首先是 std::locale(""),然后是 boost:
不过,我不知道它为什么会这样!
c++ - 在 Mac 中使用 C++ 读取 UTF-8 数据不起作用
尽管我的 C++ 经验已大大减少,但我正在尝试帮助 C++ 程序员让他的库在 Mac 上运行。目前,问题似乎仅与语言环境/编码有关。
为了创建一个最小的工作示例,我测试了以下代码,它将一行 UTF-8 字符读取为一个宽字符串 (wstring),然后遍历该字符串并打印每个字符。
虽然它在 Linux 机器上完美运行,所有字符都打印在不同的行中,但在使用 Mac 机器时,我每行打印每个字节(而不是每个字符)。
代码是:
我的测试字符串是一个愚蠢的葡萄牙语句子:
我正在尝试使用 Boost_locale,因为有人告诉我这是让 unicode 在 Mac 上正常工作的方法,但我很高兴有一个仅使用 C++ 标准库的解决方案。
编辑:
以下代码适用于 Mac。由于包含 codecvt,它无法在我的 Linux 机器上编译,但我可以通过一些 CPP 指令来管理它。
c++ - 获取 boost::locale::conv 中函数的用户代码页名称
手头的任务
我正在从 Windows 上的 UTF-8 编码 XML 解析文件名。我需要将该文件名传递给我无法更改的函数。它在内部使用_fsopen()
不支持 Unicode 字符串的。
目前的方法
我目前的方法是将文件名转换为用户的字符集,希望文件名可以在该编码中表示。然后我boost::locale::conv::from_utf()
用来从 UTF-8 转换,我boost::locale::util::get_system_locale()
用来获取当前语言环境的名称。
生活很好?
我在使用代码页Windows-1252的德语系统上,因此get_system_locale()
正确生成de_DE.windows-1252。如果我使用包含变音符号的文件名测试该方法,那么一切都会按预期工作。
问题
只是为了确保我将系统区域设置切换为使用代码页Windows-1251的乌克兰语。在文件名中使用一些西里尔字母我的方法失败了。原因是get_system_locale()
仍然产生de_DE.windows-1252现在不正确。
另一方面GetACP()
,德国语言环境正确产生 1252,乌克兰语言环境正确产生 1251。我也知道 Boost.Locale 可以转换为给定的语言环境,因为这个小型测试程序可以按我的预期工作:
问题
如何以 Boost.Locale 支持的格式查询用户语言环境的名称?使用yield German_Germany.1252
std::locale("").name()
,使用它会导致异常。boost::locale::conv::invalid_charset_error
尽管我应该将其更改为本地管理员,但系统区域设置是否可能仍然是de_DE.windows-1252 ?同样,系统语言是德语,尽管我的帐户的语言是英语。(在我登录之前,登录屏幕是德语)
我应该坚持使用短文件名吗?虽然似乎不能可靠地工作。
印刷精美
- 编译器是 MSVC18
- Boost 是 1.56.0 版本,后端据说是 winapi
- 系统是Win7,系统语言是德语,用户语言是英语
c++ - 在 Boost 中使用 UnicodeString
我已阅读该ICU
库backend
在boost::locale
. 如果是这样,我们可以UnicodeString
在 boost 中使用 ICU 的类型吗?有人可以举个例子吗..
编辑:这是我最后尝试的。在这里,我需要一个 UnicodeString,而不是存储到 wstring。
c++ - 通过 Boost.ProgramOptions 使用类似 gettext 的翻译
我试图提供std::string
参数作为选项的描述。一般而言,其生命范围未定义的论点。具体来说,我想提供翻译。
add_options()
返回一个实例,options_description_easy_init
该实例预先定义了()
运算符,以便您可以使用上面的语法。现在,该操作员只接受const char*
描述,这让我很恼火。因此,我有以下问题:
- 解决这个问题的方法是什么?
这个类的所有权政策是什么?这些指针是否仅存储,因此源应该与描述一样多地存在,或者它是安全的(糟糕!):
/li>仅
const char_type*
作为描述参数的理由是什么?
c++ - boost::locale::date_time:如何从 Boost C++ 中的 date_time 对象获取数据?
我试图在我的代码中处理日期和时间,并且已经指向了 boost 库的方向——特别是 boost::locale::date_time (部分是因为这让我避免了夏令时的怪异,这让我以前的实施困难)。
但是,我得到的结果不一致。当我将日期存储在 date_time 对象中,然后尝试从中获取数据时,这是不正确的。这是一个例子:
我究竟做错了什么?我只想提取保存的天、月、年、小时等。
谢谢你。
编辑:我最初可能以不正确的方式设置 date_time 。假设我有整数(不是字符串)格式的所有相关数据,是否有更好的方法来显式设置日期时间(例如,设置为 2016 年 12 月 19 日)?
c++ - boost::locale::conv::from_utf 在 Ubuntu 上不起作用
我正在尝试将带有特殊引号符号的 utf-8 字符串转换为 Latin1。代码在 Windows 上完美运行,但省略了 g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 上的符号
字符串:Latin1:APOST ( ' ) QUOTE ( " ) ( « » )
Windows:Latin1:APOST ( ' ) QUOTE ( " ) ( < > )
Ubuntu:Latin1:APOST ( ) QUOTE ( ) ( )
转换后的字符串的十六进制表示:
如何获得类似于 Windows 的 Ubuntu 结果?
使用 iconv 在 Ubuntu 上的结果
android - 如何为 android 构建 boost::locale
我有一个项目,它的 boost 1.64 可以在 android 上运行。现在,我需要启用boost::locale
依赖于ICU
/ ICONV
libs 的库。我下载了https://github.com/pelya/libiconv-libicu-android,并成功编译。然后我添加列表
到我的 cmake 文件。但不幸的是,升压日志仍然告诉我:
构建 Boost C++ 库。
从boost::locale
官方文档中,我发现似乎 ICU 库是共享库,但 libiconv-libicu-android 只提供静态库。有关系吗?
希望任何人都可以提供帮助,在此先感谢。