Giới thiệu
Bài viết hướng dẫn mã hóa URL (URL Encoding) trong Android sử dụng java.net.URLEncoder. Mã hóa cần thiết khi URL chứa ký tự đặc biệt (khoảng trắng, tiếng Việt, ký tự Unicode...) để đảm bảo tuân thủ chuẩn RFC 3986.
Các bước thực hiện
Bước 1: Tạo dự án mới
Android Studio → File → New Project → Empty Activity.
Bước 2: Giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="4dp"
tools:context=".MainActivity">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/btnEncode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:text="Tải URL" />
</RelativeLayout>
Bước 3: Logic (src/MainActivity.java)
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class MainActivity extends AppCompatActivity {
Button button;
private WebView webView;
String strURL;
private String query;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView);
button = findViewById(R.id.btnEncode);
// URL cơ sở
strURL = "https://stackoverflow.com/search?q=";
try {
// Mã hóa query string: "android drawables" → "android+drawables" hoặc "android%20drawables"
query = URLEncoder.encode("android drawables", "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
strURL += query;
button.setOnClickListener(v -> {
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
Toast.makeText(getApplicationContext(), "Trang đã tải xong", Toast.LENGTH_SHORT).show();
}
});
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(strURL);
});
}
}
Bước 4: Manifest (Cần quyền INTERNET)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Nhấn nút "Tải URL" → WebView mở StackOverflow tìm kiếm "android drawables".

Chi tiết về URLEncoder
// Mã hóa
String encoded = URLEncoder.encode("tìm kiếm tiếng việt", "UTF-8");
// Kết quả: "ti%E1%BA%BFm+ki%E1%BA%BFm+ti%E1%BA%BFng+vi%E1%BB%87t"
// Giải mã
String decoded = URLDecoder.decode(encoded, "UTF-8");
// Kết quả: "tìm kiếm tiếng việt"
Lưu ý quan trọng
- Chỉ encode phần query/parameter, KHÔNG encode toàn bộ URL (sẽ làm hỏng scheme, domain, path)
URLEncoderdùng+cho khoảng trắng (theo application/x-www-form-urlencoded). RFC 3986 dùng%20. Cần thay thế nếu API server yêu cầu strict RFC.- Luôn dùng
"UTF-8"làm charset - Bắt buộc try-catch
UnsupportedEncodingException(checked exception)
Thư viện hiện đại hơn
- OkHttp HttpUrl:
HttpUrl.parse(baseUrl).newBuilder().addQueryParameter("q", "android drawables").build()- tự động encode - Retrofit @Query: Tự động encode parameter
- Uri.Builder (Android SDK):
Uri.parse(baseUrl).buildUpon().appendQueryParameter("q", "value").build()
Ví dụ dùng Uri.Builder (Khuyến nghị cho Android)
String baseUrl = "https://stackoverflow.com/search";
Uri uri = Uri.parse(baseUrl).buildUpon()
.appendQueryParameter("q", "android drawables")
.appendQueryParameter("sort", "votes")
.build();
webView.loadUrl(uri.toString());
// Kết quả: https://stackoverflow.com/search?q=android+drawables&sort=votes