C++ std::locale ("en") 在 iOS 上抛出异常

标签 c++ ios c++11

在 iOS 上,当我尝试从有效标识符构造 C++ 语言环境时,我的程序崩溃了:

Terminating app due to uncaught exception 'collate_byname::collate_byname failed to construct for en', reason: 'collate_byname::collate_byname failed to construct for 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 库用于定位语言环境定义的 BS​​D 环境变量,而不是像 GNU/Linux 上那样的 LOCPATH)

PATH_LOCALE 是语言环境文件的基本路径,每个语言环境都在一个子目录中,例如:

fr/LC_TIME 神父/.. en/LC...

所以我需要子目录,iOS bundle 不支持子目录。

当你做的时候

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。

https://code.google.com/archive/p/ziparchive/

关于C++ std::locale ("en") 在 iOS 上抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51949128/

相关文章:

c++ - FreeImage:FreeImage_GetBits 访问的像素数据不正确(数据 + 大小)

c++ - Flex 编译文件 (lex.yy.c) 找不到 header /依赖项并且编译异常

c++ - 全局 bool 变量和模板

ios - 如何根据设备文本大小更改标签大小 - Swift 3?

c++ - 在 C++11 中序列化类型 id?

c++ - 含参数 (const T&, const T&) 或 (const char (&)[N], const char (&)[M]) 的重载模板的模糊调用

objective-c - iOS - 识别之前在 UINavigationController 中显示的 UIViewController

iphone - iOS 上的 Segues 与 addSubView

c++ - 设置加密++

c++ - 获取对模板参数给定类型对象的虚拟引用