CÓ, bạn đã hiểu chính xác. Đây là VCL và tài liệu của nó bị hỏng. Sự nhầm lẫn của bạn hoàn toàn có ý nghĩa!
Trong triển khai Delphi 2009+, bạn phải sử dụng thuộc tính AsString
cho AnsiString
và AsWideString
cho string=UnicodeString
.
Trong thực tế, As*String
thuộc tính được định nghĩa như vậy:
property AsString: string read GetAsString write SetAsString;
property AsWideString: UnicodeString read GetAsWideString write SetAsWideString;
property AsAnsiString: AnsiString read GetAsAnsiString write SetAsAnsiString;
Làm thế nào trên trái đất chúng ta có thể tìm ra rằng AsString
trả về một AnsiString
? Nó chỉ không có ý nghĩa gì cả, khi so sánh với phần còn lại của VCL/RTL.
Việc triển khai, sử dụng lớp TStringField
cho AnsiString
và TWideStringField
cho string=UnicodeString
bị hỏng.
Hơn nữa, documentation is also broken:
Data.DB.TField.AsString
Đại diện cho giá trị của lĩnh vực như là một chuỗi (Delphi) hoặc một AnsiString (C++).
Điều này không đại diện cho string
ở Delphi, nhưng AnsiString
! Thực tế là tài sản sử dụng một loại đồng bằng string=UnicodeString
là hoàn toàn bỏ lỡ.
Trên quan điểm cơ sở dữ liệu, điều đó tùy thuộc vào trình điều khiển DB để xử lý Unicode hoặc làm việc với bộ ký tự cụ thể. Nhưng trên quan điểm VCL, trong Delphi 2009+ bạn chỉ nên biết về loại string
và tự tin rằng việc sử dụng AsString: String
sẽ sẵn sàng với Unicode.
Nguồn
2013-04-22 05:32:13
+1 Vì hành vi này là IMHO, việc triển khai sai VCL. Đó là IMHO một tên sai, * không phù hợp với phần còn lại của VCL/RTL * và một nguồn rất nhiều nhầm lẫn/hiểu lầm. Câu hỏi của bạn hoàn toàn có ý nghĩa. –