Tôi hiện đang làm việc trên một ứng dụng IOS sẽ có tìm kiếm toàn văn. Việc tìm kiếm được thực hiện bằng cách thực hiện câu lệnh chọn trên cơ sở dữ liệu sqlite, nhưng vấn đề là nhiều giá trị trong cơ sở dữ liệu chứa chữ cái Scandinavia (Æ, Ö, Á vv) và tôi gặp sự cố khi chuyển đổi câu lệnh mà không nhận giá trị hex cho các chữ cái.Cách mã hóa NSString chính xác cho SQLite trong khi vẫn giữ các chữ cái Scandinavia
Đây là những gì tôi đang thực hiện:
const char *sql = [[NSString stringWithFormat:
@"SELECT %@\
FROM Customer c\
JOIN Customer_Metadata cm ON c.CustomerId = cm.CustomerId\
WHERE cm.Name LIKE '%%%@%%'\
ORDER BY cm.Name", kCustomerSelect, searchString] UTF8String];
Bây giờ kCustomerSelect là một hằng số chứa các cột tôi muốn chọn, và searchString chứa đầu vào người dùng.
Điều này hoạt động như một nét duyên dáng cho các chữ cái La-tinh bình thường, nhưng nếu tôi ví dụ truyền theo Ö, dưới dạng một chuỗi tìm kiếm, tôi nhận được lệnh \ xc3 \ xb6. Tôi biết rằng chỉ cần đăng xuất một chuỗi được mã hóa UTF8 sẽ không cung cấp biểu diễn chính xác của chuỗi, nhưng vấn đề là câu lệnh chọn của tôi không cho tôi bất kỳ kết quả nào.
Tôi đang gọi sqlite3_open() trước khi thực hiện truy vấn và từ tài liệu SQLite * "Mã hóa mặc định cho cơ sở dữ liệu sẽ là UTF-8 nếu sqlite3_open() hoặc sqlite3_open_v2() được gọi và UTF-16 ở gốc thứ tự byte nếu sqlite3_open16() được sử dụng. "*.
Tôi đã thử sử dụng các mã hóa khác nhau bằng cách thay thế UTF8String
bằng cStringUsingEncoding:
và thử các mã hóa khác nhau. Không ai trong số họ đã làm việc (không phải là tôi đã mong đợi họ, nhưng ít nhất là muốn thử).
Bất kỳ và tất cả trợ giúp hoặc mẹo đều được đánh giá cao.
Chỉnh sửa Tôi hiện đã thử sử dụng Trình duyệt cơ sở dữ liệu SQLite để chạy cùng một câu lệnh chọn trên cơ sở dữ liệu và không nhận được bất kỳ kết quả nào. Điều này khiến tôi tin rằng điều này có thể liên quan đến tôi bằng cách sử dụng FTS3 để tạo bảng Customer_Metadata của tôi.
MrDresden
Đáng buồn thay, sau khi thử cả ICU và Unicode61, tôi vẫn không nhận được kết quả. Tôi có thể cần phải tạo một tokenizer tùy chỉnh như bạn nói. – Hrafn