You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:35:14