Tidak ada informasi di mana pun yang memiliki otoritas yang sama dengan informasi resmi. Hari ini saya akhirnya menemukan solusi untuk masalah pengkodean ASP dari MSDN.
Berikut ini adalah kutipan dari MSDN.
Menyetel @CODEPAGE secara eksplisit memengaruhi string literal dalam satu respons. Response.CodePage memengaruhi string dinamis dalam satu respons, dan Session.CodePage memengaruhi string dinamis di semua respons dalam satu sesi.
Kalimat ini dengan jelas menjelaskan fungsi masing-masing @CODEPAGE, Response.CodePage, dan Session.CodePage.
@CODEPAGE bertindak pada semua string statis, seperti const blogname="my home" dalam sebuah file.
Response.CodePage, Session.CodePage bertindak pada semua string keluaran dinamis, seperti <%=blogname%
> Intinya adalah cakupan Response.CodePage adalah respons tunggal, sedangkan cakupan Session.CodePage yang dideklarasikan di SXNA adalah semua respons dalam satu sesi.
Lihat kalimat lain.
Jika Response.CodePage tidak disetel secara eksplisit di halaman, maka secara implisit disetel oleh Session.CodePage, jika sesi diaktifkan. Jika sesi tidak diaktifkan, Response.CodePage disetel oleh @CodePage, jika @CodePage ada di halaman. Jika tidak ada @CodePage di halaman, Response.CodePage diatur oleh properti metabase AspCodePage. Jika properti metabase AspCodePage tidak diatur, atau diatur ke 0, Response.CodePage diatur oleh halaman kode ANSI sistem.
Sekilas, saya memahami kalimat ini sebagai berikut: ketika sesi diaktifkan, jika Response.CodePage tidak dideklarasikan, Response.CodePage akan ditetapkan oleh Session.CodePage. Jika sesi tidak diaktifkan, jika @CodePage telah dideklarasikan, Response.CodePage akan ditetapkan oleh @CodePage, dll.......
Kalimat ini menjelaskan mengapa setelah keluar dari SXNA Sangat mudah untuk memiliki karakter yang kacau saat memasukkan beberapa halaman lain seperti oblog, z-blog, dll, karena program lain tidak mendeklarasikan Response.CodePage dan SXNA kebetulan mendeklarasikan Session.CodePage Oleh karena itu, segera setelah Anda memasuki SXNA, Session.CodePage langsung diberi nilai (berbeda versi, ada Beberapa versi ditetapkan 936, beberapa versi ditetapkan 65001), dan kemudian ketika memasuki program lain, Response.CodePage segera ditetapkan oleh Session.CodePage Jika kode Response.CodePage berbeda dari halaman itu sendiri , halaman akan kacau. Jadi saat muncul karakter kacau saat masuk ke z-blog, saya cek Session.CodePage dan Response.CodePage sama-sama 936, dan saat muncul karakter kacau saat masuk oblog, Session.CodePage dan Response.CodePage sama-sama 65001. Artinya, jika saya ingin memastikan permukaan daun Jika tidak ada kode yang kacau, Response.CodePage harus dideklarasikan, jika tidak maka akan menafsirkan halaman web sesuai dengan Session.CodePage (daripada menafsirkan halaman web sesuai dengan @codepage)
. ikuti penjelasan di atas, sebenarnya saya sangat bingung, karena kita semua Ini adalah sistem operasi Cina. Anda dapat mencoba menampilkan Session.CodePage setiap kali Anda masuk ke browser. Mengapa dia tidak menetapkan Session.CodePage 936 default ke Response.CodePage saat memasuki Z-blog? Sebaliknya, berikan @CodePage ke Response.CodePage? Dalam keadaan apa Session.CodePage harus ditugaskan ke Response.CodePage? Bagaimana seharusnya kita memahami teks asli "sesi diaktifkan"?
Mungkin kata-kata di atas harus dipahami seperti ini:
ketika Session.CodePage dideklarasikan oleh program apa pun, jika Response.CodePage tidak dideklarasikan, Response.CodePage akan ditetapkan oleh Session.CodePage. Jika Session.CodePage belum dideklarasikan oleh program apa pun, jika @CodePage telah dideklarasikan, Response.CodePage akan diberi nilai oleh @CodePage..., dan bagian konten dinamis akhir halaman akan diinterpretasikan sesuai dengan nilainya dari Response.CodePage.
Karena Zblog dan Oblog mendeklarasikan @CodePage, ketika pengguna baru saja memulai mesin dan kemudian masuk ke browser untuk menelusuri Zblog dan Oblog, Response.CodePage akan diberi nilai oleh @CodePage, sehingga tampilan daunnya normal.
Kalimat ini menjelaskan lebih lanjut penyebab karakter kacau.
Jika Anda menyetel Response.CodePage atau Session.CodePage secara eksplisit, lakukan sebelum mengirimkan string non-literal ke klien. Jika Anda menggunakan string literal dan non-literal di halaman yang sama, pastikan halaman kode @CODEPAGE cocok dengan halaman kode Response.CodePage, atau string literal dikodekan berbeda dari string non-literal dan ditampilkan secara tidak benar.
Salah satu kalimat yang lebih berguna adalah jika Response.CodePage dan @CODEPAGE berbeda, karakter kacau akan dihasilkan. Artinya, ketika @CODEPAGE=65001 Z-blog dan Response.CodePage Z-blog ditetapkan 936 oleh Session.CodePage, karakter kacau akan muncul, dan sebaliknya untuk oblog.
Saya tidak tahu apakah penjelasan di atas cukup jelas -_-||.
Izinkan saya menjelaskan mengapa SXNA terkadang menetapkan Session.CodePage ke 936. Saya memiliki versi yang menulis seperti ini:
<% OriginalCodePage=Session.CodePage %>
.. .....
<% Session.CodePage=OriginalCodePage %>
Saat pengguna memasuki browser, Session.CodePage defaultnya adalah 936. Default 936 saat ini tidak dideklarasikan oleh program, sehingga tidak akan ditetapkan ke Response.CodePage. Saat memasuki SXNA, Session.CodePage dilempar oleh yang di atas kode menjadi Session.CodePage=936 yang dideklarasikan oleh program, jadi ketika masuk ke Zblog lagi, 936 diberikan ke Response.CodePage.
Sejauh ini, semua alasannya telah dianalisis dengan jelas.
Oleh karena itu, kode untuk memastikan bahwa daun asp tidak akan tampak kacau harus seperti ini: (dengan asumsi itu adalah daun UTF-8)
<%@ CODEPAGE=65001 %>
<% Response.CodePage=65001%>
<% Response. Rangkaian Karakter = "UTF-8" %>
Jelaskan lebih lanjut kenapa Response.Charset harus ditambahkan, karena MSDN bilang harus ditambahkan... Haha
Jika halaman kode diset dalam satu halaman, maka Response.Charset juga harus diset.
Selain itu, format file
halaman Web harus sama dengan @CODEPAGE yang digunakan di halaman tersebut.
Inilah sebabnya mengapa beberapa program seperti zblog dan pjblog perlu menyimpan file dalam format pengkodean UTF8.
Singkatnya, jika semua program mendeklarasikan Response.CodePage, mereka tidak akan diganggu oleh Session.CodePage dan menyebabkan karakter kacau. Jadi Session.CodePage masih belum bisa digunakan dengan mudah!
Artikel referensi: