我有一个C#(。Net Core 1.1)应用,需要检查网址是否有效。我使用了Uri.IsWellFormedUriString(),它运行得很好,但对下面的这个返回false有疑问。在我看来,URL完全有效吗?
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/Black"
android:padding="10dp">
<TextView
android:id="@+id/artist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:paddingRight="5dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/White"
android:text="Demo text"
android:textSize="23px"
android:textStyle="bold"
android:typeface="sans" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/artist"
android:layout_marginTop="4dp"
android:layout_toLeftOf="@+id/play_pause"
android:ellipsize="end"
android:text="Hello there"
android:maxLines="2"
android:paddingRight="5dp"
android:textColor="@color/White"
android:textSize="31px"
android:textStyle="bold|normal"
android:typeface="sans" />
<ImageButton
android:id="@+id/play_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="@null"
android:padding="8dp" />
</RelativeLayout>
我在下面的PHP函数中使用了相同的URL,表示URL格式正确:
Uri.IsWellFormedUriString("http://www.test.com/search/Le+Venezuela+b%C3%A9n%C3%A9ficie+d%27importantes+ressources+naturelles+%3A+p%C3%A9trole%2C+gaz%2C+mines", UriKind.Absolute)
我在这里错过了什么吗?
答案 0 :(得分:2)
问题可能是网址被转义了。请尝试使用UnscapeDataString
:
string urlencoded= "http://www.test.com/search/Le+Venezuela+b%C3%A9n%C3%A9ficie+d%27importantes+ressources+naturelles+%3A+p%C3%A9trole%2C+gaz%2C+mines";
var isWellFormed=Uri.IsWellFormedUriString(
Uri.UnescapeDataString(urlencoded),
UriKind.Absolute);
修改强>
当您使用.net核心时,也许您需要使用System.Net.WebUtility.UrlDecode
答案 1 :(得分:1)
问题是%2C
,不必要地转义;把它作为逗号,它报告为真。
答案 2 :(得分:1)
这似乎是bug in DotNet.,如果URI既包含Å或like等非ASCII字符又包含任何URI保留字符(! * ' ( ) ; : @ & = + $ , / ? # [ ]
),则它似乎总是返回false。如果该保留字符是百分比编码的,它将失败。
这些将通过:
"https://example.com/a"
"https://example.com/a*"
"https://example.com/a%2A"
"https://example.com/*"
"https://example.com/%2A"
"https://example.com/%C3%A5*"
"https://example.com/%E0%B8%95%E0%B8%B1*"
这些将失败:
"https://example.com/%C3%A5%2A"
"https://example.com/%E0%B8%95%E0%B8%B1%2A"
如此有效地,您要么必须去除那些百分比编码的特殊字符,要么找到其他URI检查器,要么等待Microsoft对其进行修复。