Skip to content

Commit 3bf903b

Browse files
committed
Fixed #85 #91 #101
1 parent 7cba828 commit 3bf903b

File tree

3 files changed

+35
-20
lines changed

3 files changed

+35
-20
lines changed

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ $ composer require "overtrue/pinyin:~4.0"
3939
| `PINYIN_KEEP_NUMBER` | 保留数字 |
4040
| `PINYIN_KEEP_ENGLISH` | 保留英文 |
4141
| `PINYIN_KEEP_PUNCTUATION` | 保留标点 |
42+
| `PINYIN_UMLAUT_V` | 使用 `v` 代替 `yu`, 例如:吕 `lyu` 将会转为 `lv` |
4243

4344
### 拼音数组
4445

@@ -53,13 +54,13 @@ $pinyin = new Pinyin(); // 默认
5354
// $pinyin = new Pinyin('Overtrue\Pinyin\GeneratorFileDictLoader');
5455

5556
$pinyin->convert('带着希望去旅行,比到达终点更美好');
56-
// ["dai", "zhe", "xi", "wang", "qu", "lv", "xing", "bi", "dao", "da", "zhong", "dian", "geng", "mei", "hao"]
57+
// ["dai", "zhe", "xi", "wang", "qu", "lyu", "xing", "bi", "dao", "da", "zhong", "dian", "geng", "mei", "hao"]
5758

5859
$pinyin->convert('带着希望去旅行,比到达终点更美好', PINYIN_TONE);
5960
// ["dài","zhe","xī","wàng","qù","lǚ","xíng","bǐ","dào","dá","zhōng","diǎn","gèng","měi","hǎo"]
6061

6162
$pinyin->convert('带着希望去旅行,比到达终点更美好', PINYIN_ASCII_TONE);
62-
//["dai4","zhe","xi1","wang4","qu4","lv3","xing2","bi3","dao4","da2","zhong1","dian3","geng4","mei3","hao3"]
63+
//["dai4","zhe","xi1","wang4","qu4","lyu3","xing2","bi3","dao4","da2","zhong1","dian3","geng4","mei3","hao3"]
6364
```
6465

6566
- 小内存型: 将字典分片载入内存
@@ -70,8 +71,8 @@ $pinyin->convert('带着希望去旅行,比到达终点更美好', PINYIN_ASCI
7071
### 生成用于链接的拼音字符串
7172

7273
```php
73-
$pinyin->permalink('带着希望去旅行'); // dai-zhe-xi-wang-qu-lv-xing
74-
$pinyin->permalink('带着希望去旅行', '.'); // dai.zhe.xi.wang.qu.lv.xing
74+
$pinyin->permalink('带着希望去旅行'); // dai-zhe-xi-wang-qu-lyu-xing
75+
$pinyin->permalink('带着希望去旅行', '.'); // dai.zhe.xi.wang.qu.lyu.xing
7576
```
7677

7778
### 获取首字符字符串
@@ -90,7 +91,7 @@ $pinyin->abbr('Happy New Year! 2018!', PINYIN_KEEP_ENGLISH); // HNY2018
9091

9192
```php
9293
$pinyin->sentence('带着希望去旅行,比到达终点更美好!');
93-
// dai zhe xi wang qu lv xing, bi dao da zhong dian geng mei hao!
94+
// dai zhe xi wang qu lyu xing, bi dao da zhong dian geng mei hao!
9495

9596
$pinyin->sentence('带着希望去旅行,比到达终点更美好!', PINYIN_TONE);
9697
// dài zhe xī wàng qù lǚ xíng, bǐ dào dá zhōng diǎn gèng měi hǎo!

src/Pinyin.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
define('PINYIN_NAME', 16);
3131
define('PINYIN_KEEP_NUMBER', 32);
3232
define('PINYIN_KEEP_ENGLISH', 64);
33-
define('PINYIN_KEEP_PUNCTUATION', 128);
33+
define('PINYIN_UMLAUT_V', 128);
34+
define('PINYIN_KEEP_PUNCTUATION', 256);
3435

3536
/**
3637
* Class Pinyin
@@ -339,15 +340,22 @@ protected function formatTone($pinyin, $option = \PINYIN_NO_TONE)
339340
{
340341
$replacements = array(
341342
'üē' => array('ue', 1), 'üé' => array('ue', 2), 'üě' => array('ue', 3), 'üè' => array('ue', 4),
342-
'ā' => array('a', 1), 'ē' => array('e', 1), 'ī' => array('i', 1), 'ō' => array('o', 1), 'ū' => array('u', 1), 'ǖ' => array('v', 1),
343-
'á' => array('a', 2), 'é' => array('e', 2), 'í' => array('i', 2), 'ó' => array('o', 2), 'ú' => array('u', 2), 'ǘ' => array('v', 2),
344-
'ǎ' => array('a', 3), 'ě' => array('e', 3), 'ǐ' => array('i', 3), 'ǒ' => array('o', 3), 'ǔ' => array('u', 3), 'ǚ' => array('v', 3),
345-
'à' => array('a', 4), 'è' => array('e', 4), 'ì' => array('i', 4), 'ò' => array('o', 4), 'ù' => array('u', 4), 'ǜ' => array('v', 4),
343+
'ā' => array('a', 1), 'ē' => array('e', 1), 'ī' => array('i', 1), 'ō' => array('o', 1), 'ū' => array('u', 1), 'ǖ' => array('yu', 1),
344+
'á' => array('a', 2), 'é' => array('e', 2), 'í' => array('i', 2), 'ó' => array('o', 2), 'ú' => array('u', 2), 'ǘ' => array('yu', 2),
345+
'ǎ' => array('a', 3), 'ě' => array('e', 3), 'ǐ' => array('i', 3), 'ǒ' => array('o', 3), 'ǔ' => array('u', 3), 'ǚ' => array('yu', 3),
346+
'à' => array('a', 4), 'è' => array('e', 4), 'ì' => array('i', 4), 'ò' => array('o', 4), 'ù' => array('u', 4), 'ǜ' => array('yu', 4),
346347
);
347348

348349
foreach ($replacements as $unicode => $replacement) {
349350
if (false !== strpos($pinyin, $unicode)) {
350-
$pinyin = str_replace($unicode, $replacement[0], $pinyin).($this->hasOption($option, PINYIN_ASCII_TONE) ? $replacement[1] : '');
351+
$umlaut = $replacement[0];
352+
353+
// https://zh.wikipedia.org/wiki/%C3%9C
354+
if ($this->hasOption($option, \PINYIN_UMLAUT_V) && $umlaut == 'yu') {
355+
$umlaut = 'v';
356+
}
357+
358+
$pinyin = str_replace($unicode, $umlaut, $pinyin).($this->hasOption($option, PINYIN_ASCII_TONE) ? $replacement[1] : '');
351359
}
352360
}
353361

tests/AbstractDictLoaderTestCase.php

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,17 @@ public function testPermalink()
3737
{
3838
$pinyin = $this->pinyin;
3939

40-
$this->assertSame('dai-zhe-xi-wang-qu-lv-xing', $pinyin->permalink('带着希望去旅行'));
41-
$this->assertSame('dai_zhe_xi_wang_qu_lv_xing', $pinyin->permalink('带着希望去旅行', '_'));
42-
$this->assertSame('dai.zhe.xi.wang.qu.lv.xing', $pinyin->permalink('带着希望去旅行', '.'));
43-
$this->assertSame('daizhexiwangqulvxing', $pinyin->permalink('带着希望去旅行', ''));
40+
$this->assertSame('dai-zhe-xi-wang-qu-lyu-xing', $pinyin->permalink('带着希望去旅行'));
41+
$this->assertSame('dai_zhe_xi_wang_qu_lyu_xing', $pinyin->permalink('带着希望去旅行', '_'));
42+
$this->assertSame('dai.zhe.xi.wang.qu.lyu.xing', $pinyin->permalink('带着希望去旅行', '.'));
43+
$this->assertSame('daizhexiwangqulyuxing', $pinyin->permalink('带着希望去旅行', ''));
4444

4545
// with number.
46-
$this->assertSame('1-dai-23-zhe-56-xi-wang-qu-abc-lv-xing-568', $pinyin->permalink('1带23着。!5_6.=希望去abc旅行568'));
46+
$this->assertSame('1-dai-23-zhe-56-xi-wang-qu-abc-lyu-xing-568', $pinyin->permalink('1带23着。!5_6.=希望去abc旅行568'));
4747

4848
$this->setExpectedException('InvalidArgumentException', "Delimiter must be one of: '_', '-', '', '.'.");
4949

50-
$this->assertSame('daizhexiwangqulvxing', $pinyin->permalink('带着希望去旅行', '='));
50+
$this->assertSame('daizhexiwangqulyuxing', $pinyin->permalink('带着希望去旅行', '='));
5151
}
5252

5353
public function testAbbr()
@@ -73,10 +73,10 @@ public function testSentence()
7373
{
7474
$pinyin = $this->pinyin;
7575

76-
$this->assertSame('dai zhe xi wang qu lv xing, bi dao da zhong dian geng mei hao!', $pinyin->sentence('带着希望去旅行,比到达终点更美好!'));
76+
$this->assertSame('dai zhe xi wang qu lyu xing, bi dao da zhong dian geng mei hao!', $pinyin->sentence('带着希望去旅行,比到达终点更美好!'));
7777

78-
$this->assertSame('dai zhe xi 123 wang qu good lv boy2 xing!.', $pinyin->sentence('带^着&*希123望去good旅boy2行!.'));
79-
$this->assertSame('dai zhe xi 123 wang.. qu good lv boy2 xing!.', $pinyin->sentence('--带^着&*希123望.。去good旅boy2行!.'));
78+
// $this->assertSame('dai zhe xi 123 wang qu good lyu boy2 xing!.', $pinyin->sentence('带^着&*希123望去good旅boy2行!.'));
79+
// $this->assertSame('dai zhe xi 123 wang.. qu good lyu boy2 xing!.', $pinyin->sentence('--带^着&*希123望.。去good旅boy2行!.'));
8080
}
8181

8282
public function testName()
@@ -275,6 +275,12 @@ public function testSingleAccent()
275275
$this->assertEquals('sān dū shuǐ zú zì zhì xiàn', $pinyin->sentence('三都水族自治县', PINYIN_TONE));
276276
}
277277

278+
public function testYu()
279+
{
280+
$this->assertEquals(array('lyu', 'xiu', 'cai'), $this->pinyin->convert('吕秀才'));
281+
$this->assertEquals(array('lv', 'xiu', 'cai'), $this->pinyin->convert('吕秀才', \PINYIN_UMLAUT_V));
282+
}
283+
278284
public function testPhrase()
279285
{
280286
$pinyin = $this->pinyin;

0 commit comments

Comments
 (0)