c++ - C++ std::locale("en") 在 iOS 上抛出异常
问题描述
在 iOS 上,当我尝试从有效标识符构造 C++ 语言环境时,我的程序崩溃:
由于未捕获的异常“collate_byname::collate_byname 无法为 en 构造”而终止应用程序,原因:“collate_byname::collate_byname 无法为 en 构造”
在这一行:
std::locale loc("en");
这在其他平台上运行良好。这是平台上存在的有效语言环境标识符(我尝试使用来自 CFLocale 的标识符)。
例如,我的程序需要一个 C++std::locale
来格式化日期和数字。
也许我需要在构建中包含其他库?
我正在使用最新的 XCode 9.4.1 及其包含的 libc++,它在 iOS 11.4.1 上运行。其他 C++ 功能在那里可以正常工作。
不幸的是,没有办法用便携式 C++ 列出可用的语言环境,尽管我尝试过的所有语言都在 NSLocale.availableLocaleIdentifiers 中列出
解决方案
在对此进行了一些研究之后,我了解到 C 语言环境不包含在 iOS 版本中。没有任何。
我的解决方案(因为我想从 C++ 格式化价格、时间和日期),它在我的应用程序中提供语言环境定义。在第一次启动时解压缩它们,并将 PATH_LOCALE 环境变量设置为新创建的目录。(PATH_LOCALE 是 C 库用于定位语言环境定义的 BSD 环境变量,而不是像 GNU/Linux 上的 LOCPATH)
PATH_LOCALE 是语言环境文件的基本路径,每个语言环境都在一个子目录中,例如:
fr/LC_TIME fr/.. en/LC...
所以我需要子目录,而 iOS 包不支持子目录。
当你这样做
setlocale(LC_CTYPE,"en_US.UTF-8");
C 库在 PATH_LOCALE 中查找名为“en_US.UTF-8”的目录。
NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString* localeDir = [documentsPath stringByAppendingPathComponent:@"/locale"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:localeDir];
if (!fileExists) {
NSString *filepath = [[NSBundle mainBundle] pathForResource:@"locale" ofType:@"zip"];
ZipArchive *zipArchive = [[ZipArchive alloc] init];
[zipArchive UnzipOpenFile:filepath];
[zipArchive UnzipFileTo:documentsPath overWrite:YES];
[zipArchive UnzipCloseFile];
}
setenv("PATH_LOCALE", [[NSString stringWithFormat:@"%@/locale", documentsPath] cString], 1);
这使用您必须包含在项目中的 Ziparchive。
推荐阅读
- android - Unable to open debugger port (8600) Android Studio in MAC
- python - Combining rows from one excel to another in a specific location
- python - 在 DataFrame 上应用具有多个参数的滚动函数
- angular - How to fix the duplication of my arrays from the form inputs
- android - FirebaseFirestore 未执行给定的查询
- typescript - 节点模块 Typescript 类实例类型检查
- flutter - 在颤振应用程序的后台运行特定功能
- javascript - JavaScript - 如何为 Socket.io 事件创建自定义 API 侦听器?
- c# - 如何获取 Elasticsearch NEST 响应的聚合类属性?
- sql - Oracle to Sql server:如何重现这个 select 语句?