2015-05-29 13 views
9

Trên trang coldfusion của tôi, tôi gọi thủ tục PL/SQL. Biểu mẫu HTML được mã hóa bằng UTF-8, Oracle oracle có mã hóa WE8ISO8859P1. Vì vậy, loại chuyển đổi nào xảy ra trong trường hợp của i_value bên dưới?Mã hóa nào được sử dụng khi gọi thủ tục Oracle PL/SQL

Tôi đặc biệt quan tâm đến những gì xảy ra với MS Word quote trái (được mã hóa bằng UTF-8 là E28098). Khi tôi giải mã i_value trong PL/SQL, mã này sẽ trở thành 18 (Hex). Xem xét nó là U + 2018 điều này làm cho một số ý nghĩa, nhưng tôi vẫn tự hỏi tại sao các 20 là nuốt.

<CFSTOREDPROC PROCEDURE = "my_schema.lib.write_field" datasource="#datasource#"> 
     <cfprocparam cfsqltype="CF_SQL_VARCHAR" variable="i_name" value="remark" type="In"> 
     <cfprocparam cfsqltype="CF_SQL_VARCHAR" variable="i_value" value="#Form.remark#" type="In"> 
</CFSTOREDPROC> 
+0

Tôi không phải là chuyên gia CF, vì vậy không có câu trả lời, chỉ nhận xét: Mỗi môi trường khách hàng (và CF của bạn là một khách hàng vào DB Oracle của bạn) kết nối với Oracle DB sử dụng một NLS_LANG env. biến để xác định bộ ký tự máy khách được sử dụng cho các kết nối Oracle DB. Vì vậy, có một bộ ký tự được thiết lập ở bên Oracle DB của bạn (WE8ISO8859P1), thứ hai tại trang HTML của bạn (UTF8), thứ ba tại máy chủ ColdFusion của bạn, tôi đoán, và có lẽ, có thể là phần thứ tư được thiết lập cho Ứng dụng khách Oracle được sử dụng trong máy chủ CF của bạn. Tôi cho rằng bạn sẽ phải tìm tùy chọn cụ thể đó và thiết lập tùy chọn đó, ví dụ: ENGLISH_AMERICA.AL32UTF8. – nop77svk

+0

Biến NLS_LANG, tất nhiên, có thể được trao đổi cho một số loại tham số chuyên dụng trong kết nối Oracle DB của bạn. (ODP.NET làm như vậy, nếu tôi nhớ chính xác.) Tuy nhiên, bình luận của tôi áp dụng - bạn sẽ phải tìm thấy rằng tài sản kết nối DB và thiết lập nó. – nop77svk

+0

@ nop77svk Ngay cả sau khi biết mã hóa khách hàng, tôi muốn biết loại chuyển đổi nào xảy ra. Tôi nhận thấy rằng một số byte dường như bị nuốt khi được gửi tới DB, ví dụ: dấu ngoặc đơn bên trái (0x2018 trong UTF-16) chỉ trở thành 0x18 trong DB. – Roland

Trả lời

0

ColdFusion dựa trên Java nên tôi đoán các biến chuỗi được mã hóa bằng UTF-16.

Khi đi từ UTF-16 (mã hóa 2 byte) sang mã hóa 1 byte (ví dụ: WE8ISO8859P1) như trường hợp trong ví dụ của tôi, MSB bị bỏ qua và chỉ có LSB được xem xét.

Điều này sẽ giải thích hành vi được quan sát: Tôi nhận thấy rằng một số byte dường như bị nuốt khi được gửi tới DB, ví dụ: left single quotation mark (0x2018 trong UTF-16) chỉ trở thành 0x18 trong DB.

Các vấn đề liên quan