については、我々は以下のスタンドアロンのコードを以下、私の職場でCFLocaleCopyCurrentのAPI間違った戻り値
#include <CoreFoundation/CoreFoundation.h>
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <boost/cast.hpp>
// Reference release
struct reference_close
{
void operator()(const void *ref) const
{
CFRelease(static_cast<CFTypeRef>(ref));
}
}; // end of reference_close structure
typedef std::unique_ptr<const void, reference_close> reference_uptr;
std::string get_user_locale()
{
reference_uptr ref_ptr(CFLocaleCopyCurrent());
CFLocaleRef locale_ref(static_cast<CFLocaleRef>(ref_ptr.get()));
if (locale_ref == nullptr)
{
return std::string();
}
const size_t default_size(128);
std::vector<char> buff(default_size);
CFStringRef str_ref(CFLocaleGetIdentifier(locale_ref));
// CFStringRef str_ref((CFStringRef)CFLocaleGetValue(locale_ref,kCFLocaleLanguageCode));
if (str_ref != nullptr)
{
CFIndex len(CFStringGetLength(str_ref) + 1);
if (len > boost::numeric_cast<CFIndex>(default_size))
{
buff.resize(len);
}
buff[0] = 0;
if (!CFStringGetCString(str_ref, &buff[0], len, kCFStringEncodingISOLatin1))
{
return std::string();
}
}
return std::string(&buff[0]);
} // end of get_user_locale()
int main()
{
std::cout << "get_user_locale() : "<<get_user_locale() << std::endl;
return 0;
}
は私たちにOS X 10.12と10.13のベータ上の異なる出力を与える状況にあります。
これは簡単なことです。 10.12機械
1に
)RU
2として嗜好Ruなどの言語と地域を設定)は
3マシンを再起動)の出力に "デフォルトはAppleLocaleを-g読み出す" GET出力が { ru_RU }
であることを確認してください。4)コードをコンパイルし、exeを実行します。出力は{ru_RU}となります。
次に、OS X 10.13(ベータ)マシンの手順1)〜3)を繰り返して、同じexeを実行します(10.12で作成したものです。私たちが得る出力は "en_RU"ですが、これは正しくありません。
ここに何か不足していますか?またはこれはOS X 10.13(ベータ版)の既知の問題ですか?もしそうなら、私たちはこれをどのように修正するのですか?我々はまた、NSLocaleインタフェースを使用するには、次のObjective-Cのコードを書いたし、あまりにも10.13(ベータ版)
#import <Foundation/Foundation.h>
int main()
{
@autoreleasepool
{
NSLog(@"localeIdentifier: %@", [[NSLocale currentLocale] localeIdentifier]);
}
}