2016-04-18 4 views
2

Ich versuche, eine URL in UIWebView zu öffnen, die Unicode-Zeichen enthält:Unicode URL = Es konnte keine Instanz des Typs initialisieren 'Foundation.NSUrl': die native 'initWithString:'

var jrURL = new NSURL("http://δπθ.gr"); 

Ergebnisse in:

Could not initialize an instance of the type 'Foundation.NSUrl': 
the native 'initWithString:' method returned nil. 
It is possible to ignore this condition by setting 
MonoTouch.ObjCRuntime.Class.ThrowOnInitFailure to false. 

Ones wie https://Google.com funktionieren

Antwort

3

IDN Domain-Namen wie:

Haben umgewandelt (Punycode-basiert), um mit NSUrl Gebrauch sein werden:

IDN: https://en.wikipedia.org/wiki/Internationalized_domain_name

Punycode: https://en.wikipedia.org/wiki/Punycode

Sie können System.Globalization.IdnMapping verwenden, um Ihre Domänennamen in Punycode und zu konvertieren. Dieser Namespace/Class ist in und Xamarin.Android verfügbar.

var idn = new System.Globalization.IdnMapping(); 
var dotnetURI = new System.Uri ("http://δπθ.gr); 
Console.WriteLine (dotnetURI.ToString()); 
NSUrl nsURL = new NSUrl (dotnetURI.Scheme, idn.GetAscii (dotnetURI.DnsSafeHost), dotnetURI.PathAndQuery); 
Console.WriteLine (nsURL.ToString()); 
WebView.LoadRequest(new NSUrlRequest(nsURL)); 

MSDN IdnMapping.GetAscii: https://msdn.microsoft.com/en-us/library/system.globalization.idnmapping.getascii(v=vs.110).aspx

Hinweis:System.Uri.IdnHost die Umwandlungen Punycode Handhabung ist ein Teil von .NET 4.6 und ist derzeit nicht in der System des Xamarin Namespace

Ref: https://msdn.microsoft.com/en-us/library/system.uri.idnhost(v=vs.110).aspx

+0

Gibt es eine native iOS-Funktion? –

+0

Überraschend gibt es nicht, Safari/Webkit hat diese Funktion eingebaut, aber es ist nicht über irgendein SDK verfügbar, das ich kenne. Hier ist ein in ObjC geschriebener Punycodekonverter, den man in eine statische Bibliothek einbinden und mit Sharpie verbinden kann (https: //github.com/wordpress-mobile/NSURL-IDN), aber mit dem .Net basierten ist "einfacher" – SushiHangover

+0

danke. Ich habe IdnMapping verwendet und es funktioniert –

Verwandte Themen