overtrue/pinyin
Convert Chinese characters to Pinyin in PHP/Laravel. overtrue/pinyin supports full pinyin, initials, tone options, segmentation, and custom dictionaries—ideal for search indexing, sorting, slugs, and transliteration in web apps.
Installation
composer require overtrue/pinyin
No additional configuration is required—just autoload the package.
First Use Case Convert a single Chinese string to Hanyu Pinyin:
use Overtrue\Pinyin\Pinyin;
$pinyin = new Pinyin();
$result = $pinyin->convert('你好世界'); // Returns: 'ni hao shi jie'
Where to Look First
Overtrue\Pinyin\Pinyin class methods:
convert() – Basic conversion.convertFirstChar() – Convert only the first character.convertFirstCharToLower() – First character lowercase.Basic Conversion
$pinyin = new Pinyin();
$pinyin->convert('Laravel'); // 'la ra vel' (handles mixed scripts)
Batch Processing
$names = ['张三', '李四', '王五'];
$pinyinNames = collect($names)->map(fn($name) => $pinyin->convert($name));
// ['zhang san', 'li si', 'wang wu']
URL/Slug Generation
$slug = Str::slug($pinyin->convert('我的博客'), '-');
// 'wo-de-bo-ke'
Custom Separators
$pinyin->convert('hello世界', '_'); // 'hello_shi_jie'
Integration with Eloquent
// Add a mutator to a User model
public function setPinyinAttribute()
{
$this->attributes['pinyin'] = app(Pinyin::class)->convert($this->name);
}
Dictionary Overrides
$pinyin = new Pinyin();
$pinyin->setDictionary(['张三' => 'zhangsan']); // Custom mapping
Performance Optimization For bulk operations, cache results:
$cache = new Cache();
$pinyin->convertCached('input', function() use ($cache) {
return $cache->remember('pinyin:input', now()->addHour(), fn() =>
app(Pinyin::class)->convert('input')
);
});
Localization
Use convertFirstChar() for acronyms (e.g., '张三' → 'Z' for initials).
Dictionary Limitations
setDictionary() or submit PRs to the repo.Performance with Large Inputs
Mixed Scripts
preg_match_all('/[\p{Han}]/u', $input, $matches);
$pinyin->convert(implode('', $matches[0]));
Case Sensitivity
convertFirstCharToLower() for mixed-case needs.Dependency Conflicts
Overtrue\Pinyin.Verify Input Log the input string to ensure it contains Chinese characters:
dd(mb_strlen($input, 'UTF-8'), mb_strlen($pinyin->convert($input), 'UTF-8'));
Check Dictionary Inspect the loaded dictionary:
$pinyin->getDictionary()->get('张三'); // Returns 'zhang san'
Fallback for Missing Terms Handle undefined terms gracefully:
try {
$result = $pinyin->convert('未知词');
} catch (\Overtrue\Pinyin\Exception\NotSupportException $e) {
$result = 'unknown';
}
Custom Rules
Override the Pinyin class to add logic (e.g., skip certain characters):
class CustomPinyin extends \Overtrue\Pinyin\Pinyin {
protected function shouldSkip($char) {
return parent::shouldSkip($char) || $char === '的';
}
}
Event Hooks Extend the package by listening to conversion events (if supported in future versions).
Testing
Mock the Pinyin class for unit tests:
$mock = Mockery::mock(Pinyin::class)->shouldReceive('convert')->andReturn('test');
$this->app->instance(Pinyin::class, $mock);
How can I help you explore Laravel packages today?