三省堂 クラウン独和辞典 第5版 mdx

这本是学习型德日词典,词汇数64000多,接近朗氏的体量,带发音,从logovista转换的。

下载:
通过网盘分享的文件:三省堂 クラウン独和辞典 第5版
链接: https://pan.baidu.com/s/1RbBesNYFHBobU4-QyquHTg 提取码: 1234

三省堂 クラウン独和辞典 第5版 - FreeMdict Cloud

Thanks for your great effort @wynick27 :orange_heart:

@Wankata Here is a very nice new dictionary ! :heart_eyes:

Added to the cloud; thanks to both of you!

多谢楼主,太赞了

非常感謝!
不過我發現了一個小小的瑕疵——這個辭典的索引沒有索引大部分的變元音條目——比如說查詢“öffnen”必須用"offnen"去查。德語中絕大多數有üöä的詞匯都得換成uoa才能查詢。

palmöl一词带标号查不到,得不带才能查到

用pyglossary将.mdx转换成.txt,用下述python脚本修改txt,用pangloss将.txt转换回.mdx。

import re
import sys
from bs4 import BeautifulSoup

def extract_display_headword(html_content):
    """
    从 <span class="hw_midasigo"> 中提取纯文本显示词头
    去除所有 HTML 标签、图片、分隔符标记
    """
    soup = BeautifulSoup(html_content, 'html.parser')
    # 查找第一个 class 包含 'hw_midasigo' 的 span
    hw_tag = soup.find('span', class_=re.compile(r'^hw_midasigo'))
    if not hw_tag:
        return None
    # 获取纯文本(自动递归处理嵌套标签)
    text = hw_tag.get_text(strip=True)
    # 移除所有方括号及其内容(半角和全角)
    text = re.sub(r'[\[[][^\]]*?[\]]]', '', text)
    # 移除结尾的空白和数字(可能单独存在的序号)
    text = re.sub(r'\d+$', '', text)
    text = re.sub(r'\s+$', '', text)
    # 移除常见的分隔符(点、竖线、中黑点等)
    text = re.sub(r'[|・·•*=()]', '', text)
    # 去除多余空白
    text = ' '.join(text.split())
    return text if text else None

def process_line(line):
    """
    处理一行 TSV,返回修正后的行
    如果无法处理,返回原行
    """
    line = line.rstrip('\n')
    if '\t' not in line:
        return line
    headword_part, content = line.split('\t', 1)
    
    # 分割词头列表
    headwords = headword_part.split('|')
    
    # 提取显示词头
    display = extract_display_headword(content)
    if not display:
        return line
    
    # 如果显示词头已经在词头列表中(完全匹配),则无需添加
    if display in headwords:
        return line
    
    # 否则,将显示词头添加到最前面
    new_headwords = [display] + headwords
    new_headword_part = '|'.join(new_headwords)
    
    return new_headword_part + '\t' + content

def main(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as fin:
        lines = fin.readlines()
    
    processed_lines = []
    total = len(lines)
    modified = 0
    for i, line in enumerate(lines, 1):
        new_line = process_line(line)
        if new_line != line.rstrip('\n'):
            modified += 1
            print(f'已修正第 {i} 行')
        processed_lines.append(new_line)
    
    with open(output_file, 'w', encoding='utf-8') as fout:
        fout.write('\n'.join(processed_lines))
    
    print(f'\n处理完成!共处理 {total} 行,修正 {modified} 个词条。')
    print(f'输出文件:{output_file}')

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print('用法: python fix_headwords.py 输入文件.txt 输出文件.txt')
        sys.exit(1)
    main(sys.argv[1], sys.argv[2])

CROWNDJ5.mdx (13.2 MB)

试了这个mdx,仍然查不到palmöl


我这里GoldenDict-ng和GoldenDict Mobile(转换成stardict本体+.dsl.files.zip资源包)都没问题啊。
我又试了下,除了GoldenDict,《词悦》《德语助手》也可以。
Mdict安卓版和DictTango似乎根本不识别pangloss生成的.mdx。不光带Umlaut的查不到,该辞典的所有词都查不到。

PC版DictTango也查不到。GD-ng不是因为有优化吗

难到是mdict utils生成的词典有问题

Windows版DictTango我没用过,我是W10LTSC1809+Debian13的双启动,根本装不了Windows版DictTango,也就没有尝试了。但是我试了Android版不行,猜测Windows版也不行,现在看来果然如此。
另外,《词悦》也是可以的。

mdict和dicttango都是二分查询mdx索引,因为效率最高。而mdx内置索引排序算法是黑盒,各个构建mdx工具(甚至官方的rust库和mdxbuilder都不一样)只要与查询软件推定的排序实现不一样,二分查询就失效了。

论坛已经讨论好多次了,居然还有这么多人不知道。这些特殊字母的排序很容易出现分歧,stripkey也会影响排序。

mdict-utils作者在issues里也回应过,没有打算调整排序算法,因为没有意义。软件不重新提取排序,使用mdx内部索引的话,这个问题不可能解决。goldendict是会重建索引的,随词典导入产生巨大的缓存索引文件,所以不会遇到问题。

mdx3.0有了内置ICU排序说明部分,理论上可以解决这个问题,但是根本没人用这格式。

而且带变音符号的字母还存在两种写法吧?mdx2.0可能根本没考虑这个问题。

“ö”的两种 Unicode 形式
字母 ö 在 Unicode 标准中确实有两种等价的表示方式,它们在渲染时看起来完全一样,但底层编码不同:

  1. 预组合形式(Precomposed)
  • 编码:U+00F6
  • 说明:这是一个独立的字符,名为“拉丁小写字母 O 带分音符”(LATIN SMALL LETTER O WITH DIAERESIS)。它把字母 o 和分音符 ¨ 预先组合成了一个码点。
  1. 组合形式(Decomposed / Combining)
  • 编码:o + U+0308
  • 说明:先写一个普通的字母 oU+006F),再紧跟一个“组合分音符”(COMBINING DIAERESIS,U+0308)。渲染时,U+0308 会自动叠加上去,视觉上形成 ö

《词悦》能查询也是因为它不使用MDX内部索引而是自建了索引吧。

嗯,这个词悦在Windows上的UI效果不太美观,现在用得少,不知道词典加载多了性能如何。DictTango Windows版有简繁通查的功能,即使词条全是繁体索引也能用简体搜索到,这个有点离不开。我再用AALookup试试。

多种写法也不该是格式考虑吧,难道要枚举完所有等价情况拖慢打包速度和复杂化格式设计?辞典制作者或者软件端实现都可以。。。
mdx格式是一键对一值,没必要也没法在你打包时额外加键(不然会造成解包后和制作方源文件不等价),格式设计没有多键对一值。真需要就是制作者加@@@LINK重定向

繁简通查这个现在好办。因为我跟《词悦》的作者建议之后,词悦现在和GoldenDict-ng一样支持hunspell了。
hunspell就能用来实现中文的简体繁体通查。

zh_CN.aff 不需要任何实质内容,指定编码为 UTF‑8 就行:

SET UTF-8
LANG zh
FLAG long
# 空壳

zh_CN.dic 的内容类似这样,第一行是词条数目,然后每行都是st:(本来是hunspell用来标记不规则动词原形的doge):

12
簡體 st:简体
简体 st:簡體
繁體 st:繁体
繁体 st:繁體
发 st:髮
发 st:發
髮 st:发
發 st:发
復制 st:复制
複製 st:复制
复制 st:復制
复制 st:複製

把你的所有中文辞典的词头导出然后用python+opencc跑一遍,再把一简对多繁手动修一修。
gen_zh_dic.py (2.7 KB)

这比直接调用opencc没准还好,因为opencc一个输入只能对应一个输出,而hunspell是可以一个输入对应多个输出的。輸入「复制」,GoldenDict能同时查到「復制」和「複製」。

嗯,用pyglossary转换成的txt中看不出,但mdx内部肯定是这样的
我跟词悦的作者之前报了好几个@@@LINK 相关bug……

原来还有这个坑,实测不是stripkey的问题,而是排序问题,我用拉鲁斯对比的:

我本来就说是排序问题啊。。。干嘛急着反驳我。stripkey是影响因素之一,顺嘴提一句不行吗。软件端发现stripkey标记后,大小写通搜无视ascii符号,排序会更加混乱,更难定位到词条。