最近在做一个导航网站,需要将中文转成url。

尝试了两种。

选型

第一种 pinyin

很大使用量的库,https://www.npmjs.com/package/pinyin?activeTab=versions

但……

不知道为什么,在nextjs14下无法正常使用,没办法,只能放弃了。

  1. import pinyin from "pinyin";
  2. console.log(pinyin("中心")); // [ [ 'zhōng' ], [ 'xīn' ] ]
  3. console.log(pinyin("中心", {
  4. heteronym: true, // 启用多音字模式
  5. })); // [ [ 'zhōng', 'zhòng' ], [ 'xīn' ] ]
  6. console.log(pinyin("中心", {
  7. heteronym: true, // 启用多音字模式
  8. segment: true, // 启用分词,以解决多音字问题。默认不开启,使用 true 开启使用 Intl.Segmenter 分词库。
  9. })); // [ [ 'zhōng' ], [ 'xīn' ] ]
  10. console.log(pinyin("中心", {
  11. segment: "@node-rs/jieba", // 指定分词库,可以是 "Intl.Segmenter", "nodejieba"、"segmentit"、"@node-rs/jieba"。
  12. })); // [ [ 'zhōng' ], [ 'xīn' ] ]
  13. console.log(pinyin("我喜欢你", {
  14. segment: "segmentit", // 启用分词
  15. group: true, // 启用词组
  16. })); // [ [ 'wǒ' ], [ 'xǐhuān' ], [ 'nǐ' ] ]
  17. console.log(pinyin("中心", {
  18. style: "initials", // 设置拼音风格。
  19. heteronym: true, // 即使有多音字,因为拼音风格选择,重复的也会合并。
  20. })); // [ [ 'zh' ], [ 'x' ] ]
  21. console.log(pinyin("华夫人", {
  22. mode: "surname", // 姓名模式。
  23. })); // [ ['huà'], ['fū'], ['rén'] ]

第二种 pinyin-pro

不亏死pro!

用起来是真的舒服!

  1. import { pinyin } from "pinyin-pro";
  2. // 获取字符串格式拼音
  3. pinyin("汉语拼音"); // 'hàn yǔ pīn yīn'
  4. // 获取数组格式拼音
  5. pinyin("汉语拼音", { type: "array" }); // ["hàn", "yǔ", "pīn", "yīn"]
  6. // 获取不带音调格式拼音
  7. pinyin("汉语拼音", { toneType: "none" }); // "han yu pin yin"
  8. // 获取不带音调数组格式拼音
  9. pinyin("汉语拼音", { toneType: "none", type: "array" }); // ["han", "yu", "pin", "yin"]
  10. // 音调以数字形式显示
  11. pinyin("汉语拼音", { toneType: "num" }); // "han4 yu3 pin1 yin1"
  12. // 自动识别多音字
  13. pinyin("睡着了"); // "shuì zháo le"

https://www.npmjs.com/package/pinyin-pro

参考文档:https://pinyin-pro.cn/use/pinyin.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%88%86%E9%9A%94%E7%AC%A6

实现代码

这下就简单了,直接进行字符串的转换:

  1. // 将传入的字符串转换为url友好的链接
  2. // 如果是汉字,转换为拼音
  3. export function NameToUrl(name: string) {
  4. // p// 获取不带声调的拼音
  5. const res = pinyin(name, {
  6. toneType: "none",
  7. separator: "-",
  8. nonZh: "consecutive",
  9. })
  10. return res
  11. }