首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取用户的ISO 3166-1 alpha-2国家代码

获取用户的ISO 3166-1 alpha-2国家代码
EN

Stack Overflow用户
提问于 2014-07-08 21:08:36
回答 1查看 2.3K关注 0票数 1

我想知道一个可靠的方法来获得用户的ISO 3166-1 alpha-2 (2-字母代码,例如: US,CA)与c#在unity3d?

我尝试过RegionInfo.TwoLetterISORegionName,但它返回一个空字符串。

这些措施是否没有得到执行?

我该怎么做?

编辑:我在这里遇到的主要错误是,当我尝试获取TwoLetterISORegionName时,它是空的。除非我使用这个解决方法,否则CultureInfo和RegionInfo总是将美国作为文化返回:

代码语言:javascript
复制
[System.Runtime.InteropServices.DllImport("KERNEL32.DLL")]
private static extern int GetSystemDefaultLCID();

RegionInfo regionInfo = new RegionInfo(GetSystemDefaultLCID());
CultureInfo cultureInfo = new CultureInfo(GetSystemDefaultLCID());

但是,TwoLetterISORegionName是空的,ThreeLetterWindowsRegionName返回类似于“加拿大”的内容,这对我没有好处。

希望能澄清一切。

最新情况:

下面是我使用上面的代码获得的调试信息:

代码语言:javascript
复制
    Debug.Log("----- REGION INFO -----"); // Empty
    Debug.Log("CurrencyEnglishName : " + regionInfo.CurrencyEnglishName); // Empty
    Debug.Log("CurrencyNativeName : " + regionInfo.CurrencyNativeName); // Not implemented exception
    Debug.Log("CurrencySymbol : " + regionInfo.CurrencySymbol); // CAD
    Debug.Log("DisplayName : " + regionInfo.DisplayName); // Empty
    Debug.Log("EnglishName : " + regionInfo.EnglishName); // Empty
    Debug.Log("GeoId : " + regionInfo.GeoId); // 959515600
    Debug.Log("IsMetric : " + regionInfo.IsMetric); // True
    Debug.Log("ISOCurrencySymbol : " + regionInfo.ISOCurrencySymbol); // Canadian Dollar
    Debug.Log("Name : " + regionInfo.Name); // Empty
    Debug.Log("NativeName : " + regionInfo.NativeName); // Empty
    Debug.Log("ThreeLetterISORegionName : " + regionInfo.ThreeLetterISORegionName); // Empty
    Debug.Log("ThreeLetterWindowsRegionName : " + regionInfo.ThreeLetterWindowsRegionName); // Canada
    Debug.Log("TwoLetterISORegionName : " + regionInfo.TwoLetterISORegionName); // Empty

很明显,这些是错误的值(是的,我在加拿大和所有的,但3个字母代码不是“加拿大”,大地水准面不可能是大的一个数字,我上次检查),或者我遗漏了什么!

UPDATE2 :在进一步测试的外部和内部之后,我意识到GeoID总是不同的.就像一个随机数发生器!感觉不对..。有人有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-11 20:06:39

最后终于找到了解决办法。我不喜欢,但这很管用。打开Visual 2008 (重要的是它是2008年,因为您不能在更晚的版本上更改目标.NET平台,我相信),并使用完全相同的类(RegionInfo)创建了一个.dll,这与我在UnityC#中使用的类完全相同。

因此,在C++/CLR :创建一个带有一个函数的.dll,该函数以char*作为参数,将系统中的两个字符赋值为::TwoLetterISORegionName获得的字符串。在文件夹中复制.dll。

在C#/Unity中:使用.dll和您的方法名链接DllImport (这个方法不会在这里使用char*,而是使用一个IntPtr)。这里将字节分配给IntPtr,然后调用C++函数,然后读取字节(将它们转换为每个索引的字符),最后不要忘记释放内存。分配、读取和发布与Marshal类一起使用。

这不会是很好的工作与吨的字符,但由于我只有2个,这并不是太坏。我意识到这充其量只是一个粗略的解决方案,需要做大量的工作,但是由于RegionInfo类在Unity中不能很好地工作,这就是我想出来的。希望我能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24641646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档