Python中SQLite3无法匹配经arabic-reshaper处理的阿拉伯语查询数据
问题解决:Kivy阿拉伯语输入组件查询SQLite无结果
核心原因
你用arabic-reshaper和BIDI处理后的字符串是视觉显示顺序的文本,而数据库中存储的是阿拉伯语原生的逻辑顺序文本——两者字符序列完全不同,直接用显示序文本查询自然匹配不到数据。
解决方案
1. 自定义输入组件分离显示与数据逻辑
修改Ar_text组件,新增属性保存原始逻辑序输入文本,仅将处理后的文本用于显示:
from kivy.uix.textinput import TextInput import arabic_reshaper from bidi.algorithm import get_display class Ar_text(TextInput): def __init__(self, **kwargs): super().__init__(**kwargs) self.raw_text = "" # 存储原始逻辑序阿拉伯语文本 def insert_text(self, substring, from_undo=False): # 累积原始输入字符 self.raw_text += substring # 处理为显示用的视觉序文本 reshaped = arabic_reshaper.reshape(self.raw_text) display_text = get_display(reshaped) # 更新显示文本 self.text = display_text # 调整光标到输入起始位置(适配阿拉伯语从右向左输入) self.cursor = (0, len(self.text)) return super().insert_text("", from_undo=from_undo)
2. 查询时使用原始逻辑序文本
在查询回调函数中,调用输入组件的raw_text属性作为查询条件,而非text属性:
def search_number_by_name(self): # 获取原始逻辑序查询关键词 target_name = self.ar_input.raw_text.strip() # 执行SQL查询(用参数化查询避免注入问题) cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE name = ?", (target_name,)) results = cursor.fetchall() # 后续处理查询结果...
3. 验证数据库存储格式
确认CSV导入数据库时,阿拉伯语字段是以逻辑序存储的:
- 用SQLite Browser打开数据库,直接查看对应字段值
- 对比该值与你硬编码的阿拉伯语字符串的
repr()输出,确保两者一致
调试技巧
打印关键字符串的原始字符表示,快速定位差异:
print("显示文本(视觉序):", repr(self.ar_input.text)) print("原始文本(逻辑序):", repr(self.ar_input.raw_text)) print("硬编码文本(逻辑序):", repr("你的硬编码阿拉伯语字符串"))
内容的提问来源于stack exchange,提问作者sam ibraheem
相关产品推荐
相关产品推荐

