Các bản sửa lỗi trong Firebird 2.5 liên quan đến charset trong chuỗi kết nối
Tác giả: Adriano dos Santos Fernandes [email protected]
Ngày: 2008-12-15
Trước FB 2.5, các tên tệp được sử dụng trong chuỗi kết nối luôn được truyền từ máy khách đến
máy chủ mà không có bất kỳ chuyển đổi nào. Trên máy chủ, các tên tệp đó được sử dụng với các hàm API của hệ điều hành mà không có
bất kỳ chuyển đổi nào. Điều này tạo ra tình huống mà các tên tệp sử dụng ký tự không phải ASCII không
tương tác tốt khi máy khách và máy chủ là các hệ điều hành khác nhau hoặc thậm chí cùng hệ điều hành nhưng sử dụng các
codepage khác nhau.
Vấn đề được giải quyết trong FB 2.5 theo cách sau:
Tên tệp được coi, theo mặc định, là nằm trên codepage của hệ điều hành.
Một DPB mới được giới thiệu, có tên isc_dpb_utf8.filename. Ý nghĩa của nó là thay đổi quy tắc trên, để FB
nên coi tên tệp được truyền vào là ở định dạng UTF-8.
Nếu một máy khách v2.5 (hoặc mới hơn) đang giao tiếp với một máy chủ từ xa cũ hơn v2.5, và
isc_dpb_utf8.filename được sử dụng, thì máy khách chuyển đổi tên tệp từ UTF-8 sang codepage của máy khách
và truyền tên tệp đó đến máy chủ. Máy khách sẽ loại bỏ DPB isc_dpb_utf8.filename.
Điều này đảm bảo khả năng tương thích ngược khi mọi người sử dụng cùng một codepage trên máy khách và
máy chủ OS.
Nếu một máy khách v2.5 (hoặc mới hơn) đang giao tiếp với một máy chủ v2.5 (hoặc mới hơn), và
isc_dpb_utf8.filename không được sử dụng, thì máy khách chuyển đổi tên tệp từ codepage của hệ điều hành sang
UTF-8 và chèn DPB isc_dpb_utf8.filename. Nếu isc_dpb_utf8.filename được sử dụng, máy khách chỉ
truyền tên tệp gốc trong DPB đến máy chủ. Vì vậy, máy khách luôn truyền đến máy chủ
một tên tệp UTF-8 và DPB isc_dpb_utf8.filename.
Tên tệp nhận được trên máy chủ phải tuân theo các quy tắc tương tự ở trên. Nhưng lưu ý rằng máy khách v2.5
có thể tự động chuyển đổi tên tệp và chèn DPB. Các máy khách cũ hơn v2.5 thì không,
vì vậy các tên tệp nhận được sẽ được coi là nằm trên codepage của máy chủ. Chúng tôi lại đảm bảo
khả năng tương thích ngược khi codepage của máy khách và máy chủ giống nhau.
Codepage của hệ điều hành và UTF-8 có thể không phải là lựa chọn tốt nhất cho tên tệp. Ví dụ: nếu bạn có một
tập lệnh ISQL (hoặc một số công cụ khác) và tập lệnh đó sử dụng một charset kết nối khác. Bạn không thể
chỉnh sửa chính xác một tập lệnh (hoặc bất kỳ tệp nào) sử dụng nhiều bộ ký tự (codepage). Vì vậy, bây giờ bạn có thể
mã hóa bất kỳ ký tự Unicode nào dưới dạng ký tự ASCII trên tên tệp của chuỗi kết nối. Điều đó
được thực hiện bằng cách sử dụng ký hiệu #. Nó là một tiền tố cho số điểm mã Unicode (ở định dạng
thập lục phân, giống như ký hiệu U+XXXX). Bạn nên viết theo cách này: #XXXX với X là 0-9, a-f, A-F.
Nếu bạn muốn sử dụng ký tự # theo nghĩa đen, bạn có thể sử dụng ## hoặc #0023 (số điểm mã cho nó).
Ký tự đó được diễn giải với ngữ nghĩa mới này tại máy chủ ngay cả khi máy khách cũ hơn
v2.5.
Codepage của hệ điều hành được sử dụng cho các chuyển đổi là:
- Windows: Trang mã ANSI của Windows
- Khác: UTF-8
Cập nhật cho 2.5 Beta 2: 2008-07-11
Các quy tắc này bây giờ cũng có hiệu lực cho các mục DPB dạng chuỗi.