33 files changed
+11592
-462
No files matched your search
@@ -119,7 +119,7 @@ jobs:
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
npx electron-builder --publish always
|
||||
npx electron-builder --win nsis --x64 --publish always '--config.artifactName=${productName}-${version}-x64-Setup.${ext}'
|
||||
|
||||
release-windows-arm64:
|
||||
runs-on: windows-latest
|
||||
@@ -155,7 +155,7 @@ jobs:
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
npx electron-builder --win nsis --arm64 --publish always '--config.artifactName=${productName}-${version}-arm64-Setup.${ext}'
|
||||
npx electron-builder --win nsis --arm64 --publish always '--config.publish.channel=latest-arm64' '--config.artifactName=${productName}-${version}-arm64-Setup.${ext}'
|
||||
|
||||
update-release-notes:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -184,10 +184,12 @@ jobs:
|
||||
echo "$ASSETS_JSON" | jq -r --arg p "$pattern" '[.assets[].name | select(test($p))][0] // ""'
|
||||
}
|
||||
|
||||
WINDOWS_ASSET="$(echo "$ASSETS_JSON" | jq -r '[.assets[].name | select(test("\\.exe$")) | select(test("arm64") | not)][0] // ""')"
|
||||
WINDOWS_ASSET="$(echo "$ASSETS_JSON" | jq -r '[.assets[].name | select(test("x64.*\\.exe$"))][0] // ""')"
|
||||
if [ -z "$WINDOWS_ASSET" ]; then
|
||||
WINDOWS_ASSET="$(echo "$ASSETS_JSON" | jq -r '[.assets[].name | select(test("\\.exe$")) | select(test("arm64") | not)][0] // ""')"
|
||||
fi
|
||||
WINDOWS_ARM64_ASSET="$(echo "$ASSETS_JSON" | jq -r '[.assets[].name | select(test("arm64.*\\.exe$"))][0] // ""')"
|
||||
MAC_ASSET="$(pick_asset "\\.dmg$")"
|
||||
LINUX_DEB_ASSET="$(pick_asset "\\.deb$")"
|
||||
LINUX_TAR_ASSET="$(pick_asset "\\.tar\\.gz$")"
|
||||
LINUX_APPIMAGE_ASSET="$(pick_asset "\\.AppImage$")"
|
||||
|
||||
@@ -201,7 +203,6 @@ jobs:
|
||||
WINDOWS_URL="$(build_link "$WINDOWS_ASSET")"
|
||||
WINDOWS_ARM64_URL="$(build_link "$WINDOWS_ARM64_ASSET")"
|
||||
MAC_URL="$(build_link "$MAC_ASSET")"
|
||||
LINUX_DEB_URL="$(build_link "$LINUX_DEB_ASSET")"
|
||||
LINUX_TAR_URL="$(build_link "$LINUX_TAR_ASSET")"
|
||||
LINUX_APPIMAGE_URL="$(build_link "$LINUX_APPIMAGE_ASSET")"
|
||||
|
||||
@@ -216,10 +217,15 @@ jobs:
|
||||
- Windows x64(Win10+): ${WINDOWS_URL:-$RELEASE_PAGE}
|
||||
- Windows arm64: ${WINDOWS_ARM64_URL:-$RELEASE_PAGE}
|
||||
- macOS(M系列芯片): ${MAC_URL:-$RELEASE_PAGE}
|
||||
- Linux (.deb) (即将废弃): ${LINUX_DEB_URL:-$RELEASE_PAGE}
|
||||
- Linux (.tar.gz): ${LINUX_TAR_URL:-$RELEASE_PAGE}
|
||||
- linux (.AppImage): ${LINUX_APPIMAGE_URL:-$RELEASE_PAGE}
|
||||
|
||||
## macOS 安装提示(未知来源)
|
||||
- 若打开时提示“来自未知开发者”或“无法验证开发者”,请到「系统设置 -> 隐私与安全性」中允许打开该应用。
|
||||
- 如果仍被系统拦截,请在终端执行以下命令去除隔离标记:
|
||||
- `xattr -dr com.apple.quarantine "/Applications/WeFlow.app"`
|
||||
- 执行后重新打开 WeFlow。
|
||||
|
||||
> 如果某个平台链接暂时未生成,可进入完整发布页查看全部资源:$RELEASE_PAGE
|
||||
EOF
|
||||
|
||||
|
||||
@@ -70,3 +70,4 @@ resources/wx_send
|
||||
概述.md
|
||||
pnpm-lock.yaml
|
||||
/pnpm-workspace.yaml
|
||||
wechat-research-site
|
||||
@@ -50,13 +50,15 @@ WeFlow 是一个**完全本地**的微信**实时**聊天记录查看、分析
|
||||
|------|----------|--------|
|
||||
| Windows | Windows10+、x64(amd64) | `.exe` |
|
||||
| macOS | Apple Silicon(M 系列,arm64) | `.dmg` |
|
||||
| Linux | x64 设备(amd64) | `.deb`、`.tar.gz` |
|
||||
| Linux | x64 设备(amd64) | `.AppImage`、`.tar.gz` |
|
||||
|
||||
|
||||
## 快速开始
|
||||
|
||||
若你只想使用成品版本,可前往 [Releases](https://github.com/hicccc77/WeFlow/releases) 下载并安装。
|
||||
|
||||
> ArchLinux 用户可以选择 `yay -S weflow` 快速安装
|
||||
|
||||
## 详细功能清单
|
||||
|
||||
当前版本已支持以下能力:
|
||||
|
||||
+52
-26
@@ -1,6 +1,6 @@
|
||||
# WeFlow HTTP API / Push 文档
|
||||
|
||||
WeFlow 提供本地 HTTP API,便于外部脚本或工具读取聊天记录、会话、联系人、群成员和导出的媒体文件;也支持在检测到新消息后通过固定 SSE 地址主动推送消息事件。
|
||||
WeFlow 提供本地 HTTP API(已支持GET 和 POST请求),便于外部脚本或工具读取聊天记录、会话、联系人、群成员和导出的媒体文件;也支持在检测到新消息后通过固定 SSE 地址主动推送消息事件。
|
||||
|
||||
## 启用方式
|
||||
|
||||
@@ -11,17 +11,27 @@ WeFlow 提供本地 HTTP API,便于外部脚本或工具读取聊天记录、
|
||||
- 基础地址:`http://127.0.0.1:5031`
|
||||
- 可选开启 `主动推送`,检测到新收到的消息后会通过 `GET /api/v1/push/messages` 推送给 SSE 订阅端
|
||||
|
||||
**状态记忆**:API 服务和主动推送的状态及端口会自动保存,重启 WeFlow 后会自动恢复运行。
|
||||
|
||||
## 鉴权规范
|
||||
|
||||
**鉴权规范 (Access Token)** 除健康检查接口外,所有 `/api/v1/*` 接口均受 Token 保护。支持三种传参方式(任选其一):
|
||||
|
||||
1. **HTTP Header (推荐)**: `Authorization: Bearer <您的Token>`
|
||||
2. **Query 参数**: `?access_token=<您的Token>`(SSE 长连接推荐此方式)
|
||||
3. **JSON Body**: `{"access_token": "<您的Token>"}`(仅限 POST 请求)
|
||||
|
||||
## 接口列表
|
||||
|
||||
- `GET /health`
|
||||
- `GET /api/v1/health`
|
||||
- `GET /api/v1/push/messages`
|
||||
- `GET /api/v1/messages`
|
||||
- `GET /api/v1/messages/new`
|
||||
- `GET /api/v1/sessions`
|
||||
- `GET /api/v1/contacts`
|
||||
- `GET /api/v1/group-members`
|
||||
- `GET /api/v1/media/*`
|
||||
- `GET|POST /health`
|
||||
- `GET|POST /api/v1/health`
|
||||
- `GET|POST /api/v1/push/messages`
|
||||
- `GET|POST /api/v1/messages`
|
||||
- `GET|POST /api/v1/messages/new`
|
||||
- `GET|POST /api/v1/sessions`
|
||||
- `GET|POST /api/v1/contacts`
|
||||
- `GET|POST /api/v1/group-members`
|
||||
- `GET|POST /api/v1/media/*`
|
||||
|
||||
---
|
||||
|
||||
@@ -80,7 +90,7 @@ GET /api/v1/push/messages
|
||||
### 示例
|
||||
|
||||
```bash
|
||||
curl -N "http://127.0.0.1:5031/api/v1/push/messages"
|
||||
curl -N "http://127.0.0.1:5031/api/v1/push/messages?access_token=YOUR_TOKEN
|
||||
```
|
||||
|
||||
示例事件:
|
||||
@@ -94,6 +104,8 @@ data: {"event":"message.new","sessionId":"xxx@chatroom","messageKey":"server:123
|
||||
|
||||
## 3. 获取消息
|
||||
|
||||
> 当使用 POST 时,请将参数放在 JSON Body 中(Content-Type: application/json)
|
||||
|
||||
读取指定会话的消息,支持原始 JSON 和 ChatLab 格式。
|
||||
|
||||
**请求**
|
||||
@@ -231,6 +243,8 @@ curl "http://127.0.0.1:5031/api/v1/messages?talker=xxx@chatroom&media=1&image=1&
|
||||
|
||||
## 4. 获取会话列表
|
||||
|
||||
> 当使用 POST 时,请将参数放在 JSON Body 中(Content-Type: application/json)
|
||||
|
||||
**请求**
|
||||
|
||||
```http
|
||||
@@ -276,6 +290,8 @@ GET /api/v1/sessions
|
||||
|
||||
## 5. 获取联系人列表
|
||||
|
||||
> 当使用 POST 时,请将参数放在 JSON Body 中(Content-Type: application/json)
|
||||
|
||||
**请求**
|
||||
|
||||
```http
|
||||
@@ -325,6 +341,8 @@ GET /api/v1/contacts
|
||||
|
||||
## 6. 获取群成员列表
|
||||
|
||||
> 当使用 POST 时,请将参数放在 JSON Body 中(Content-Type: application/json)
|
||||
|
||||
返回群成员的 `wxid`、群昵称、备注、微信号等信息。
|
||||
|
||||
**请求**
|
||||
@@ -417,6 +435,8 @@ curl "http://127.0.0.1:5031/api/v1/group-members?chatroomId=xxx@chatroom&include
|
||||
|
||||
## 7. 访问导出媒体
|
||||
|
||||
> 当使用 POST 时,请将参数放在 JSON Body 中(Content-Type: application/json)
|
||||
|
||||
通过消息接口启用 `media=1` 后,接口会先把图片、语音、视频、表情导出到本地缓存目录,再返回可访问的 HTTP 地址。
|
||||
|
||||
**请求**
|
||||
@@ -461,19 +481,23 @@ curl "http://127.0.0.1:5031/api/v1/media/xxx@chatroom/emojis/emoji_300.gif"
|
||||
### PowerShell
|
||||
|
||||
```powershell
|
||||
Invoke-RestMethod http://127.0.0.1:5031/health
|
||||
Invoke-RestMethod http://127.0.0.1:5031/api/v1/sessions
|
||||
Invoke-RestMethod "http://127.0.0.1:5031/api/v1/messages?talker=wxid_xxx&limit=10"
|
||||
Invoke-RestMethod "http://127.0.0.1:5031/api/v1/group-members?chatroomId=xxx@chatroom&includeMessageCounts=1"
|
||||
$headers = @{ "Authorization" = "Bearer YOUR_TOKEN" }
|
||||
$body = @{ talker = "wxid_xxx"; limit = 10 } | ConvertTo-Json
|
||||
|
||||
Invoke-RestMethod -Uri "http://127.0.0.1:5031/api/v1/messages" -Method POST -Headers $headers -Body $body -ContentType "application/json"
|
||||
```
|
||||
|
||||
### cURL
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:5031/health
|
||||
curl "http://127.0.0.1:5031/api/v1/messages?talker=wxid_xxx&chatlab=1"
|
||||
curl "http://127.0.0.1:5031/api/v1/contacts?keyword=张三"
|
||||
curl "http://127.0.0.1:5031/api/v1/group-members?chatroomId=xxx@chatroom"
|
||||
# GET 带 Token Header
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" "http://127.0.0.1:5031/api/v1/messages?talker=wxid_xxx"
|
||||
|
||||
# POST 带 JSON Body
|
||||
curl -X POST http://127.0.0.1:5031/api/v1/messages \
|
||||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"talker": "xxx@chatroom", "chatlab": true}'
|
||||
```
|
||||
|
||||
### Python
|
||||
@@ -482,19 +506,21 @@ curl "http://127.0.0.1:5031/api/v1/group-members?chatroomId=xxx@chatroom"
|
||||
import requests
|
||||
|
||||
BASE_URL = "http://127.0.0.1:5031"
|
||||
headers = {"Authorization": "Bearer YOUR_TOKEN", "Content-Type": "application/json"}
|
||||
|
||||
messages = requests.get(
|
||||
f"{BASE_URL}/api/v1/messages",
|
||||
params={"talker": "xxx@chatroom", "limit": 50}
|
||||
# POST 方式获取消息
|
||||
messages = requests.post(
|
||||
f"{BASE_URL}/api/v1/messages",
|
||||
json={"talker": "xxx@chatroom", "limit": 50},
|
||||
headers=headers
|
||||
).json()
|
||||
|
||||
# GET 方式获取群成员
|
||||
members = requests.get(
|
||||
f"{BASE_URL}/api/v1/group-members",
|
||||
params={"chatroomId": "xxx@chatroom", "includeMessageCounts": 1}
|
||||
params={"chatroomId": "xxx@chatroom", "includeMessageCounts": 1},
|
||||
headers=headers
|
||||
).json()
|
||||
|
||||
print(messages)
|
||||
print(members)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
+43
-15
@@ -36,6 +36,10 @@ import { messagePushService } from './services/messagePushService'
|
||||
autoUpdater.autoDownload = false
|
||||
autoUpdater.autoInstallOnAppQuit = true
|
||||
autoUpdater.disableDifferentialDownload = true // 禁用差分更新,强制全量下载
|
||||
// Windows x64 与 arm64 使用不同更新通道,避免 latest.yml 互相覆盖导致下错架构安装包。
|
||||
if (process.platform === 'win32' && process.arch === 'arm64') {
|
||||
autoUpdater.channel = 'latest-arm64'
|
||||
}
|
||||
const AUTO_UPDATE_ENABLED =
|
||||
process.env.AUTO_UPDATE_ENABLED === 'true' ||
|
||||
process.env.AUTO_UPDATE_ENABLED === '1' ||
|
||||
@@ -142,33 +146,47 @@ const normalizeReleaseNotes = (rawReleaseNotes: unknown): string => {
|
||||
|
||||
if (!merged.trim()) return ''
|
||||
|
||||
const shouldStripReleaseSection = (headingRaw: string): boolean => {
|
||||
const heading = headingRaw.trim().toLowerCase()
|
||||
if (heading === '下载' || heading === 'download') return true
|
||||
|
||||
const compactHeading = heading.replace(/\s+/g, '')
|
||||
if (compactHeading.startsWith('macos安装提示')) return true
|
||||
if (compactHeading.startsWith('mac安装提示')) return true
|
||||
return false
|
||||
}
|
||||
|
||||
// 兼容 electron-updater 直接返回 HTML 的场景
|
||||
const removeDownloadSectionFromHtml = (input: string): string => {
|
||||
return input.replace(
|
||||
/<h[1-6][^>]*>\s*(?:下载|download)\s*<\/h[1-6]>\s*[\s\S]*?(?=<h[1-6]\b|$)/gi,
|
||||
''
|
||||
)
|
||||
return input
|
||||
.replace(
|
||||
/<h[1-6][^>]*>\s*(?:下载|download)\s*<\/h[1-6]>\s*[\s\S]*?(?=<h[1-6]\b|$)/gi,
|
||||
''
|
||||
)
|
||||
.replace(
|
||||
/<h[1-6][^>]*>\s*(?:mac\s*os|mac)\s*安装提示(?:\s*[((]\s*未知来源\s*[))])?\s*<\/h[1-6]>\s*[\s\S]*?(?=<h[1-6]\b|$)/gi,
|
||||
''
|
||||
)
|
||||
}
|
||||
|
||||
// 兼容 Markdown 场景(Action 最终 release note 模板)
|
||||
const removeDownloadSectionFromMarkdown = (input: string): string => {
|
||||
const lines = input.split(/\r?\n/)
|
||||
const output: string[] = []
|
||||
let skipDownloadSection = false
|
||||
let skipSection = false
|
||||
|
||||
for (const line of lines) {
|
||||
const headingMatch = line.match(/^\s*#{1,6}\s*(.+?)\s*$/)
|
||||
if (headingMatch) {
|
||||
const heading = headingMatch[1].trim().toLowerCase()
|
||||
if (heading === '下载' || heading === 'download') {
|
||||
skipDownloadSection = true
|
||||
if (shouldStripReleaseSection(headingMatch[1])) {
|
||||
skipSection = true
|
||||
continue
|
||||
}
|
||||
if (skipDownloadSection) {
|
||||
skipDownloadSection = false
|
||||
if (skipSection) {
|
||||
skipSection = false
|
||||
}
|
||||
}
|
||||
if (!skipDownloadSection) {
|
||||
if (!skipSection) {
|
||||
output.push(line)
|
||||
}
|
||||
}
|
||||
@@ -1527,8 +1545,8 @@ function registerIpcHandlers() {
|
||||
return await chatService.resolveTransferDisplayNames(chatroomId, payerUsername, receiverUsername)
|
||||
})
|
||||
|
||||
ipcMain.handle('chat:getContacts', async () => {
|
||||
return await chatService.getContacts()
|
||||
ipcMain.handle('chat:getContacts', async (_, options?: { lite?: boolean }) => {
|
||||
return await chatService.getContacts(options)
|
||||
})
|
||||
|
||||
ipcMain.handle('chat:getCachedMessages', async (_, sessionId: string) => {
|
||||
@@ -2139,6 +2157,13 @@ function registerIpcHandlers() {
|
||||
return groupAnalyticsService.getGroupMediaStats(chatroomId, startTime, endTime)
|
||||
})
|
||||
|
||||
ipcMain.handle(
|
||||
'groupAnalytics:getGroupMemberAnalytics',
|
||||
async (_, chatroomId: string, memberUsername: string, startTime?: number, endTime?: number) => {
|
||||
return groupAnalyticsService.getGroupMemberAnalytics(chatroomId, memberUsername, startTime, endTime)
|
||||
}
|
||||
)
|
||||
|
||||
ipcMain.handle(
|
||||
'groupAnalytics:getGroupMemberMessages',
|
||||
async (
|
||||
@@ -2587,8 +2612,9 @@ function registerIpcHandlers() {
|
||||
})
|
||||
|
||||
// HTTP API 服务
|
||||
ipcMain.handle('http:start', async (_, port?: number) => {
|
||||
return httpService.start(port || 5031)
|
||||
ipcMain.handle('http:start', async (_, port?: number, host?: string) => {
|
||||
const bindHost = typeof host === 'string' && host.trim() ? host.trim() : '127.0.0.1'
|
||||
return httpService.start(port || 5031, bindHost)
|
||||
})
|
||||
|
||||
ipcMain.handle('http:stop', async () => {
|
||||
@@ -2807,6 +2833,8 @@ app.whenReady().then(async () => {
|
||||
// 启动时检测更新(不阻塞启动)
|
||||
checkForUpdatesOnStartup()
|
||||
|
||||
await httpService.autoStart()
|
||||
|
||||
app.on('activate', () => {
|
||||
if (BrowserWindow.getAllWindows().length === 0) {
|
||||
mainWindow = createWindow()
|
||||
|
||||
+3
-2
@@ -225,7 +225,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||
ipcRenderer.on('chat:voiceTranscriptPartial', listener)
|
||||
return () => ipcRenderer.removeListener('chat:voiceTranscriptPartial', listener)
|
||||
},
|
||||
getContacts: () => ipcRenderer.invoke('chat:getContacts'),
|
||||
getContacts: (options?: { lite?: boolean }) => ipcRenderer.invoke('chat:getContacts', options),
|
||||
getMessage: (sessionId: string, localId: number) =>
|
||||
ipcRenderer.invoke('chat:getMessage', sessionId, localId),
|
||||
searchMessages: (keyword: string, sessionId?: string, limit?: number, offset?: number, beginTimestamp?: number, endTimestamp?: number) =>
|
||||
@@ -297,6 +297,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||
getGroupMessageRanking: (chatroomId: string, limit?: number, startTime?: number, endTime?: number) => ipcRenderer.invoke('groupAnalytics:getGroupMessageRanking', chatroomId, limit, startTime, endTime),
|
||||
getGroupActiveHours: (chatroomId: string, startTime?: number, endTime?: number) => ipcRenderer.invoke('groupAnalytics:getGroupActiveHours', chatroomId, startTime, endTime),
|
||||
getGroupMediaStats: (chatroomId: string, startTime?: number, endTime?: number) => ipcRenderer.invoke('groupAnalytics:getGroupMediaStats', chatroomId, startTime, endTime),
|
||||
getGroupMemberAnalytics: (chatroomId: string, memberUsername: string, startTime?: number, endTime?: number) => ipcRenderer.invoke('groupAnalytics:getGroupMemberAnalytics', chatroomId, memberUsername, startTime, endTime),
|
||||
getGroupMemberMessages: (
|
||||
chatroomId: string,
|
||||
memberUsername: string,
|
||||
@@ -422,7 +423,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||
|
||||
// HTTP API 服务
|
||||
http: {
|
||||
start: (port?: number) => ipcRenderer.invoke('http:start', port),
|
||||
start: (port?: number, host?: string) => ipcRenderer.invoke('http:start', port, host),
|
||||
stop: () => ipcRenderer.invoke('http:stop'),
|
||||
status: () => ipcRenderer.invoke('http:status')
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import { GroupMyMessageCountCacheService, GroupMyMessageCountCacheEntry } from '
|
||||
import { exportCardDiagnosticsService } from './exportCardDiagnosticsService'
|
||||
import { voiceTranscribeService } from './voiceTranscribeService'
|
||||
import { ImageDecryptService } from './imageDecryptService'
|
||||
import { CONTACT_REGION_LOOKUP_DATA } from './contactRegionLookupData'
|
||||
import { LRUCache } from '../utils/LRUCache.js'
|
||||
|
||||
export interface ChatSession {
|
||||
@@ -153,10 +154,17 @@ export interface ContactInfo {
|
||||
remark?: string
|
||||
nickname?: string
|
||||
alias?: string
|
||||
labels?: string[]
|
||||
detailDescription?: string
|
||||
region?: string
|
||||
avatarUrl?: string
|
||||
type: 'friend' | 'group' | 'official' | 'former_friend' | 'other'
|
||||
}
|
||||
|
||||
interface GetContactsOptions {
|
||||
lite?: boolean
|
||||
}
|
||||
|
||||
interface ExportSessionStats {
|
||||
totalMessages: number
|
||||
voiceMessages: number
|
||||
@@ -293,6 +301,21 @@ class ChatService {
|
||||
private groupMyMessageCountCacheScope = ''
|
||||
private groupMyMessageCountMemoryCache = new Map<string, GroupMyMessageCountCacheEntry>()
|
||||
private initFailureDialogShown = false
|
||||
private readonly contactExtendedFieldCandidates = [
|
||||
'label_list', 'labelList', 'labels', 'label_names', 'labelNames', 'tags', 'tag_list', 'tagList',
|
||||
'detail_description', 'detailDescription', 'description', 'desc', 'contact_description', 'contactDescription', 'signature', 'sign',
|
||||
'country', 'province', 'city', 'region',
|
||||
'profile', 'introduction', 'phone', 'mobile', 'telephone', 'tel', 'vcard', 'card_info', 'cardInfo',
|
||||
'extra_buffer', 'extraBuffer'
|
||||
]
|
||||
private readonly contactExtendedFieldCandidateSet = new Set(this.contactExtendedFieldCandidates.map((name) => name.toLowerCase()))
|
||||
private contactExtendedSelectableColumns: string[] | null = null
|
||||
private contactLabelNameMapCache: Map<number, string> | null = null
|
||||
private contactLabelNameMapCacheAt = 0
|
||||
private readonly contactLabelNameMapCacheTtlMs = 10 * 60 * 1000
|
||||
private contactsLoadInFlight: { mode: 'lite' | 'full'; promise: Promise<{ success: boolean; contacts?: ContactInfo[]; error?: string }> } | null = null
|
||||
private readonly contactDisplayNameCollator = new Intl.Collator('zh-CN')
|
||||
private readonly slowGetContactsLogThresholdMs = 1200
|
||||
|
||||
constructor() {
|
||||
this.configService = new ConfigService()
|
||||
@@ -1267,25 +1290,61 @@ class ChatService {
|
||||
/**
|
||||
* 获取通讯录列表
|
||||
*/
|
||||
async getContacts(): Promise<{ success: boolean; contacts?: ContactInfo[]; error?: string }> {
|
||||
async getContacts(options?: GetContactsOptions): Promise<{ success: boolean; contacts?: ContactInfo[]; error?: string }> {
|
||||
const mode: 'lite' | 'full' = options?.lite ? 'lite' : 'full'
|
||||
const inFlight = this.contactsLoadInFlight
|
||||
if (inFlight && (inFlight.mode === mode || (mode === 'lite' && inFlight.mode === 'full'))) {
|
||||
return await inFlight.promise
|
||||
}
|
||||
|
||||
const promise = this.getContactsInternal(options)
|
||||
this.contactsLoadInFlight = { mode, promise }
|
||||
try {
|
||||
return await promise
|
||||
} finally {
|
||||
if (this.contactsLoadInFlight?.promise === promise) {
|
||||
this.contactsLoadInFlight = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async getContactsInternal(options?: GetContactsOptions): Promise<{ success: boolean; contacts?: ContactInfo[]; error?: string }> {
|
||||
const isLiteMode = options?.lite === true
|
||||
const startedAt = Date.now()
|
||||
const stageDurations: Array<{ stage: string; ms: number }> = []
|
||||
const captureStage = (stage: string, stageStartedAt: number) => {
|
||||
stageDurations.push({ stage, ms: Date.now() - stageStartedAt })
|
||||
}
|
||||
|
||||
try {
|
||||
const connectStartedAt = Date.now()
|
||||
const connectResult = await this.ensureConnected()
|
||||
captureStage('ensureConnected', connectStartedAt)
|
||||
if (!connectResult.success) {
|
||||
return { success: false, error: connectResult.error }
|
||||
}
|
||||
|
||||
const contactsCompactStartedAt = Date.now()
|
||||
const contactResult = await wcdbService.getContactsCompact()
|
||||
captureStage('getContactsCompact', contactsCompactStartedAt)
|
||||
|
||||
if (!contactResult.success || !contactResult.contacts) {
|
||||
console.error('查询联系人失败:', contactResult.error)
|
||||
return { success: false, error: contactResult.error || '查询联系人失败' }
|
||||
}
|
||||
|
||||
let rows = contactResult.contacts as Record<string, any>[]
|
||||
if (!isLiteMode) {
|
||||
const hydrateStartedAt = Date.now()
|
||||
rows = await this.hydrateContactsWithExtendedFields(rows)
|
||||
captureStage('hydrateContactsWithExtendedFields', hydrateStartedAt)
|
||||
}
|
||||
|
||||
const rows = contactResult.contacts as Record<string, any>[]
|
||||
// 获取会话表的最后联系时间用于排序
|
||||
const sessionsStartedAt = Date.now()
|
||||
const lastContactTimeMap = new Map<string, number>()
|
||||
const sessionResult = await wcdbService.getSessions()
|
||||
captureStage('getSessions', sessionsStartedAt)
|
||||
if (sessionResult.success && sessionResult.sessions) {
|
||||
for (const session of sessionResult.sessions as any[]) {
|
||||
const username = session.username || session.user_name || session.userName || ''
|
||||
@@ -1297,9 +1356,14 @@ class ChatService {
|
||||
}
|
||||
|
||||
// 转换为ContactInfo
|
||||
const transformStartedAt = Date.now()
|
||||
const contacts: (ContactInfo & { lastContactTime: number })[] = []
|
||||
const excludeNames = new Set(['medianote', 'floatbottle', 'qmessage', 'qqmail', 'fmessage'])
|
||||
|
||||
let contactLabelNameMap = new Map<number, string>()
|
||||
if (!isLiteMode) {
|
||||
const labelMapStartedAt = Date.now()
|
||||
contactLabelNameMap = await this.getContactLabelNameMap()
|
||||
captureStage('getContactLabelNameMap', labelMapStartedAt)
|
||||
}
|
||||
for (const row of rows) {
|
||||
const username = String(row.username || '').trim()
|
||||
|
||||
@@ -1313,7 +1377,7 @@ class ChatService {
|
||||
type = 'group'
|
||||
} else if (username.startsWith('gh_')) {
|
||||
type = 'official'
|
||||
} else if (localType === 1 && !excludeNames.has(username)) {
|
||||
} else if (localType === 1 && !FRIEND_EXCLUDE_USERNAMES.has(username)) {
|
||||
type = 'friend'
|
||||
} else if (localType === 0 && quanPin) {
|
||||
type = 'former_friend'
|
||||
@@ -1322,6 +1386,9 @@ class ChatService {
|
||||
}
|
||||
|
||||
const displayName = row.remark || row.nick_name || row.alias || username
|
||||
const labels = isLiteMode ? [] : this.parseContactLabels(row, contactLabelNameMap)
|
||||
const detailDescription = isLiteMode ? '' : this.getContactSignature(row)
|
||||
const region = isLiteMode ? '' : this.getContactRegion(row)
|
||||
|
||||
contacts.push({
|
||||
username,
|
||||
@@ -1329,16 +1396,19 @@ class ChatService {
|
||||
remark: row.remark || undefined,
|
||||
nickname: row.nick_name || undefined,
|
||||
alias: row.alias || undefined,
|
||||
labels: labels.length > 0 ? labels : undefined,
|
||||
detailDescription: detailDescription || undefined,
|
||||
region: region || undefined,
|
||||
avatarUrl: undefined,
|
||||
type,
|
||||
lastContactTime: lastContactTimeMap.get(username) || 0
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
captureStage('transformContacts', transformStartedAt)
|
||||
|
||||
|
||||
// 按最近联系时间排序
|
||||
const sortStartedAt = Date.now()
|
||||
contacts.sort((a, b) => {
|
||||
const timeA = a.lastContactTime || 0
|
||||
const timeB = b.lastContactTime || 0
|
||||
@@ -1347,13 +1417,22 @@ class ChatService {
|
||||
}
|
||||
if (timeA && !timeB) return -1
|
||||
if (!timeA && timeB) return 1
|
||||
return a.displayName.localeCompare(b.displayName, 'zh-CN')
|
||||
return this.contactDisplayNameCollator.compare(a.displayName, b.displayName)
|
||||
})
|
||||
captureStage('sortContacts', sortStartedAt)
|
||||
|
||||
// 移除临时的lastContactTime字段
|
||||
const finalizeStartedAt = Date.now()
|
||||
const result = contacts.map(({ lastContactTime, ...rest }) => rest)
|
||||
captureStage('finalizeResult', finalizeStartedAt)
|
||||
|
||||
|
||||
const totalMs = Date.now() - startedAt
|
||||
if (totalMs >= this.slowGetContactsLogThresholdMs) {
|
||||
const stageSummary = stageDurations
|
||||
.map((item) => `${item.stage}=${item.ms}ms`)
|
||||
.join(', ')
|
||||
console.warn(`[ChatService] getContacts(${isLiteMode ? 'lite' : 'full'}) 慢查询 total=${totalMs}ms, ${stageSummary}`)
|
||||
}
|
||||
return { success: true, contacts: result }
|
||||
} catch (e) {
|
||||
console.error('ChatService: 获取通讯录失败:', e)
|
||||
@@ -1880,6 +1959,568 @@ class ChatService {
|
||||
return Number.isFinite(parsed) ? parsed : fallback
|
||||
}
|
||||
|
||||
private hasAnyContactExtendedFieldKey(row: Record<string, any>): boolean {
|
||||
for (const key of Object.keys(row || {})) {
|
||||
if (this.contactExtendedFieldCandidateSet.has(String(key || '').toLowerCase())) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private async hydrateContactsWithExtendedFields(rows: Record<string, any>[]): Promise<Record<string, any>[]> {
|
||||
if (!Array.isArray(rows) || rows.length === 0) return rows
|
||||
const hasAnyExtendedFieldKey = rows.some((row) => this.hasAnyContactExtendedFieldKey(row || {}))
|
||||
if (hasAnyExtendedFieldKey) {
|
||||
// wcdb_get_contacts_compact 可能只给“部分联系人”返回 extra_buffer。
|
||||
// 只有在每一行都能拿到可解析的 extra_buffer 时才跳过补偿查询。
|
||||
const allRowsHaveUsableExtraBuffer = rows.every((row) => this.toExtraBufferBytes(row || {}) !== null)
|
||||
if (allRowsHaveUsableExtraBuffer) return rows
|
||||
}
|
||||
|
||||
try {
|
||||
let selectableColumns = this.contactExtendedSelectableColumns
|
||||
if (!selectableColumns) {
|
||||
const tableInfoResult = await wcdbService.execQuery('contact', null, 'PRAGMA table_info(contact)')
|
||||
if (!tableInfoResult.success || !Array.isArray(tableInfoResult.rows)) {
|
||||
return rows
|
||||
}
|
||||
|
||||
const availableColumns = new Map<string, string>()
|
||||
for (const tableInfoRow of tableInfoResult.rows as Record<string, any>[]) {
|
||||
const rawName = tableInfoRow.name ?? tableInfoRow.column_name ?? tableInfoRow.columnName
|
||||
const name = String(rawName || '').trim()
|
||||
if (!name) continue
|
||||
availableColumns.set(name.toLowerCase(), name)
|
||||
}
|
||||
|
||||
const resolvedColumns: string[] = []
|
||||
const seenColumns = new Set<string>()
|
||||
for (const candidate of this.contactExtendedFieldCandidates) {
|
||||
const actual = availableColumns.get(candidate.toLowerCase())
|
||||
if (!actual) continue
|
||||
const normalized = actual.toLowerCase()
|
||||
if (seenColumns.has(normalized)) continue
|
||||
seenColumns.add(normalized)
|
||||
resolvedColumns.push(actual)
|
||||
}
|
||||
|
||||
this.contactExtendedSelectableColumns = resolvedColumns
|
||||
selectableColumns = resolvedColumns
|
||||
}
|
||||
|
||||
if (!selectableColumns || selectableColumns.length === 0) return rows
|
||||
|
||||
const selectColumns = ['username', ...selectableColumns]
|
||||
const sql = `SELECT ${selectColumns.map((column) => this.quoteSqlIdentifier(column)).join(', ')} FROM contact WHERE username IS NOT NULL AND username != ''`
|
||||
const extendedResult = await wcdbService.execQuery('contact', null, sql)
|
||||
if (!extendedResult.success || !Array.isArray(extendedResult.rows) || extendedResult.rows.length === 0) {
|
||||
return rows
|
||||
}
|
||||
|
||||
const extendedByUsername = new Map<string, Record<string, any>>()
|
||||
for (const extendedRow of extendedResult.rows as Record<string, any>[]) {
|
||||
const username = String(extendedRow.username || '').trim()
|
||||
if (!username) continue
|
||||
extendedByUsername.set(username, extendedRow)
|
||||
}
|
||||
if (extendedByUsername.size === 0) return rows
|
||||
|
||||
return rows.map((row) => {
|
||||
const username = String(row.username || row.user_name || row.userName || '').trim()
|
||||
if (!username) return row
|
||||
const extended = extendedByUsername.get(username)
|
||||
if (!extended) return row
|
||||
return {
|
||||
...extended,
|
||||
...row
|
||||
}
|
||||
})
|
||||
} catch (error) {
|
||||
console.warn('联系人扩展字段补偿查询失败:', error)
|
||||
return rows
|
||||
}
|
||||
}
|
||||
|
||||
private async getContactLabelNameMap(): Promise<Map<number, string>> {
|
||||
const now = Date.now()
|
||||
if (this.contactLabelNameMapCache && now - this.contactLabelNameMapCacheAt <= this.contactLabelNameMapCacheTtlMs) {
|
||||
return new Map(this.contactLabelNameMapCache)
|
||||
}
|
||||
|
||||
const labelMap = new Map<number, string>()
|
||||
try {
|
||||
const tableInfoResult = await wcdbService.execQuery('contact', null, 'PRAGMA table_info(contact_label)')
|
||||
if (!tableInfoResult.success || !Array.isArray(tableInfoResult.rows) || tableInfoResult.rows.length === 0) {
|
||||
this.contactLabelNameMapCache = labelMap
|
||||
this.contactLabelNameMapCacheAt = now
|
||||
return labelMap
|
||||
}
|
||||
|
||||
const availableColumns = new Map<string, string>()
|
||||
for (const tableInfoRow of tableInfoResult.rows as Record<string, any>[]) {
|
||||
const rawName = tableInfoRow.name ?? tableInfoRow.column_name ?? tableInfoRow.columnName
|
||||
const name = String(rawName || '').trim()
|
||||
if (!name) continue
|
||||
availableColumns.set(name.toLowerCase(), name)
|
||||
}
|
||||
|
||||
const pickColumn = (candidates: string[]): string | null => {
|
||||
for (const candidate of candidates) {
|
||||
const actual = availableColumns.get(candidate.toLowerCase())
|
||||
if (actual) return actual
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
const idColumn = pickColumn(['label_id_', 'label_id', 'labelId', 'labelid', 'id'])
|
||||
const nameColumn = pickColumn(['label_name_', 'label_name', 'labelName', 'labelname', 'name'])
|
||||
if (!idColumn || !nameColumn) {
|
||||
this.contactLabelNameMapCache = labelMap
|
||||
this.contactLabelNameMapCacheAt = now
|
||||
return labelMap
|
||||
}
|
||||
|
||||
const sql = `SELECT ${this.quoteSqlIdentifier(idColumn)} AS label_id, ${this.quoteSqlIdentifier(nameColumn)} AS label_name FROM contact_label`
|
||||
const result = await wcdbService.execQuery('contact', null, sql)
|
||||
if (result.success && Array.isArray(result.rows)) {
|
||||
for (const row of result.rows as Record<string, any>[]) {
|
||||
const id = Number(String(row.label_id ?? row.labelId ?? '').trim())
|
||||
const name = String(row.label_name ?? row.labelName ?? '').trim()
|
||||
if (Number.isFinite(id) && id > 0 && name) {
|
||||
labelMap.set(Math.floor(id), name)
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('读取 contact_label 失败:', error)
|
||||
}
|
||||
|
||||
this.contactLabelNameMapCache = labelMap
|
||||
this.contactLabelNameMapCacheAt = now
|
||||
return new Map(labelMap)
|
||||
}
|
||||
|
||||
private toExtraBufferBytes(row: Record<string, any>): Buffer | null {
|
||||
const raw = this.getRowField(row, ['extra_buffer', 'extraBuffer'])
|
||||
if (raw === undefined || raw === null) return null
|
||||
if (Buffer.isBuffer(raw)) return raw.length > 0 ? raw : null
|
||||
if (raw instanceof Uint8Array) return raw.length > 0 ? Buffer.from(raw) : null
|
||||
if (Array.isArray(raw)) {
|
||||
const bytes = Buffer.from(raw)
|
||||
return bytes.length > 0 ? bytes : null
|
||||
}
|
||||
|
||||
const text = String(raw || '').trim()
|
||||
if (!text) return null
|
||||
const compact = text.replace(/\s+/g, '')
|
||||
if (compact.length >= 2 && compact.length % 2 === 0 && /^[0-9a-fA-F]+$/.test(compact)) {
|
||||
try {
|
||||
const bytes = Buffer.from(compact, 'hex')
|
||||
return bytes.length > 0 ? bytes : null
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private readProtoVarint(buffer: Buffer, offset: number): { value: number; nextOffset: number } | null {
|
||||
if (!buffer || offset < 0 || offset >= buffer.length) return null
|
||||
let value = 0
|
||||
let shift = 0
|
||||
let index = offset
|
||||
while (index < buffer.length) {
|
||||
const byte = buffer[index]
|
||||
index += 1
|
||||
value += (byte & 0x7f) * Math.pow(2, shift)
|
||||
if ((byte & 0x80) === 0) {
|
||||
return { value, nextOffset: index }
|
||||
}
|
||||
shift += 7
|
||||
if (shift > 56) return null
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private extractExtraBufferTopLevelFieldStrings(row: Record<string, any>, targetField: number): string[] {
|
||||
const bytes = this.toExtraBufferBytes(row)
|
||||
if (!bytes || !Number.isFinite(targetField) || targetField <= 0) return []
|
||||
const values: string[] = []
|
||||
let offset = 0
|
||||
while (offset < bytes.length) {
|
||||
const tagResult = this.readProtoVarint(bytes, offset)
|
||||
if (!tagResult) break
|
||||
offset = tagResult.nextOffset
|
||||
const fieldNumber = Math.floor(tagResult.value / 8)
|
||||
const wireType = tagResult.value & 0x07
|
||||
|
||||
if (wireType === 0) {
|
||||
const varint = this.readProtoVarint(bytes, offset)
|
||||
if (!varint) break
|
||||
offset = varint.nextOffset
|
||||
continue
|
||||
}
|
||||
|
||||
if (wireType === 1) {
|
||||
if (offset + 8 > bytes.length) break
|
||||
offset += 8
|
||||
continue
|
||||
}
|
||||
|
||||
if (wireType === 2) {
|
||||
const lengthResult = this.readProtoVarint(bytes, offset)
|
||||
if (!lengthResult) break
|
||||
const payloadLength = Math.floor(lengthResult.value)
|
||||
offset = lengthResult.nextOffset
|
||||
if (payloadLength < 0 || offset + payloadLength > bytes.length) break
|
||||
const payload = bytes.subarray(offset, offset + payloadLength)
|
||||
offset += payloadLength
|
||||
if (fieldNumber === targetField) {
|
||||
const text = payload.toString('utf-8').replace(/\u0000/g, '').trim()
|
||||
if (text) values.push(text)
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if (wireType === 5) {
|
||||
if (offset + 4 > bytes.length) break
|
||||
offset += 4
|
||||
continue
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
private parseContactLabelsFromExtraBuffer(row: Record<string, any>, labelNameMap?: Map<number, string>): string[] {
|
||||
const labelNames: string[] = []
|
||||
const seen = new Set<string>()
|
||||
const texts = this.extractExtraBufferTopLevelFieldStrings(row, 30)
|
||||
for (const text of texts) {
|
||||
const matches = text.match(/\d+/g) || []
|
||||
for (const match of matches) {
|
||||
const id = Number(match)
|
||||
if (!Number.isFinite(id) || id <= 0) continue
|
||||
const labelName = labelNameMap?.get(Math.floor(id))
|
||||
if (!labelName) continue
|
||||
if (seen.has(labelName)) continue
|
||||
seen.add(labelName)
|
||||
labelNames.push(labelName)
|
||||
}
|
||||
}
|
||||
return labelNames
|
||||
}
|
||||
|
||||
private parseContactLabels(row: Record<string, any>, labelNameMap?: Map<number, string>): string[] {
|
||||
const raw = this.getRowField(row, [
|
||||
'label_list', 'labelList', 'labels', 'label_names', 'labelNames', 'tags', 'tag_list', 'tagList'
|
||||
])
|
||||
const normalizedFromValue = (value: unknown): string[] => {
|
||||
if (Array.isArray(value)) {
|
||||
return Array.from(new Set(value.map((item) => String(item || '').trim()).filter(Boolean)))
|
||||
}
|
||||
const text = String(value || '').trim()
|
||||
if (!text) return []
|
||||
return Array.from(new Set(
|
||||
text
|
||||
.replace(/[;;、|]+/g, ',')
|
||||
.split(',')
|
||||
.map((item) => item.trim())
|
||||
.filter(Boolean)
|
||||
))
|
||||
}
|
||||
|
||||
const direct = normalizedFromValue(raw)
|
||||
if (direct.length > 0) return direct
|
||||
|
||||
for (const [key, value] of Object.entries(row)) {
|
||||
const normalizedKey = key.toLowerCase()
|
||||
if (!normalizedKey.includes('label') && !normalizedKey.includes('tag')) continue
|
||||
if (normalizedKey.includes('img') || normalizedKey.includes('head')) continue
|
||||
const fallback = normalizedFromValue(value)
|
||||
if (fallback.length > 0) return fallback
|
||||
}
|
||||
|
||||
const extraBufferLabels = this.parseContactLabelsFromExtraBuffer(row, labelNameMap)
|
||||
if (extraBufferLabels.length > 0) return extraBufferLabels
|
||||
|
||||
return []
|
||||
}
|
||||
|
||||
private getContactSignature(row: Record<string, any>): string {
|
||||
const normalize = (raw: unknown): string => {
|
||||
const text = String(raw || '').replace(/\u0000/g, '').trim()
|
||||
if (!text) return ''
|
||||
const lower = text.toLowerCase()
|
||||
if (lower === '-' || lower === '--' || lower === '—' || lower === 'null' || lower === 'undefined' || lower === 'none') {
|
||||
return ''
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
const value = this.getRowField(row, [
|
||||
'signature', 'sign', 'personal_signature', 'personalSignature', 'profile', 'introduction',
|
||||
'detail_description', 'detailDescription', 'description', 'desc', 'contact_description', 'contactDescription'
|
||||
])
|
||||
const direct = normalize(value)
|
||||
if (direct) return direct
|
||||
|
||||
for (const [key, rawValue] of Object.entries(row)) {
|
||||
const normalizedKey = key.toLowerCase()
|
||||
const isCandidate =
|
||||
normalizedKey.includes('sign') ||
|
||||
normalizedKey.includes('signature') ||
|
||||
normalizedKey.includes('profile') ||
|
||||
normalizedKey.includes('intro') ||
|
||||
normalizedKey.includes('description') ||
|
||||
normalizedKey.includes('detail') ||
|
||||
normalizedKey.includes('desc')
|
||||
if (!isCandidate) continue
|
||||
if (
|
||||
normalizedKey.includes('avatar') ||
|
||||
normalizedKey.includes('img') ||
|
||||
normalizedKey.includes('head') ||
|
||||
normalizedKey.includes('label') ||
|
||||
normalizedKey.includes('tag')
|
||||
) continue
|
||||
const text = normalize(rawValue)
|
||||
if (text) return text
|
||||
}
|
||||
|
||||
// contact.extra_buffer field 4: 个性签名兜底
|
||||
const signatures = this.extractExtraBufferTopLevelFieldStrings(row, 4)
|
||||
for (const signature of signatures) {
|
||||
const text = normalize(signature)
|
||||
if (!text) continue
|
||||
return text
|
||||
}
|
||||
|
||||
return ''
|
||||
}
|
||||
|
||||
private normalizeContactRegionPart(raw: unknown): string {
|
||||
const text = String(raw || '').replace(/\u0000/g, '').trim()
|
||||
if (!text) return ''
|
||||
const lower = text.toLowerCase()
|
||||
if (lower === '-' || lower === '--' || lower === '—' || lower === 'null' || lower === 'undefined' || lower === 'none') {
|
||||
return ''
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
private normalizeRegionLookupKey(raw: string): string {
|
||||
return String(raw || '')
|
||||
.toLowerCase()
|
||||
.replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '')
|
||||
}
|
||||
|
||||
private buildRegionLookupCandidates(raw: string): string[] {
|
||||
const normalized = this.normalizeRegionLookupKey(raw)
|
||||
if (!normalized) return []
|
||||
|
||||
const candidates = new Set<string>([normalized])
|
||||
const withoutTrailingDigits = normalized.replace(/\d+$/g, '')
|
||||
if (withoutTrailingDigits) candidates.add(withoutTrailingDigits)
|
||||
|
||||
return Array.from(candidates)
|
||||
}
|
||||
|
||||
private normalizeChineseProvinceName(raw: string): string {
|
||||
const text = String(raw || '').trim()
|
||||
if (!text) return ''
|
||||
return text
|
||||
.replace(/特别行政区$/g, '')
|
||||
.replace(/维吾尔自治区$/g, '')
|
||||
.replace(/壮族自治区$/g, '')
|
||||
.replace(/回族自治区$/g, '')
|
||||
.replace(/自治区$/g, '')
|
||||
.replace(/省$/g, '')
|
||||
.replace(/市$/g, '')
|
||||
.trim()
|
||||
}
|
||||
|
||||
private normalizeChineseCityName(raw: string): string {
|
||||
const text = String(raw || '').trim()
|
||||
if (!text) return ''
|
||||
return text
|
||||
.replace(/特别行政区$/g, '')
|
||||
.replace(/自治州$/g, '')
|
||||
.replace(/地区$/g, '')
|
||||
.replace(/盟$/g, '')
|
||||
.replace(/林区$/g, '')
|
||||
.replace(/市$/g, '')
|
||||
.trim()
|
||||
}
|
||||
|
||||
private resolveProvinceLookupKey(raw: string): string {
|
||||
const candidates = this.buildRegionLookupCandidates(raw)
|
||||
if (candidates.length === 0) return ''
|
||||
|
||||
for (const candidate of candidates) {
|
||||
const byName = CONTACT_REGION_LOOKUP_DATA.provinceKeyByName[candidate]
|
||||
if (byName) return byName
|
||||
if (CONTACT_REGION_LOOKUP_DATA.provinceNameByKey[candidate]) return candidate
|
||||
}
|
||||
|
||||
return candidates[0]
|
||||
}
|
||||
|
||||
private toChineseCountryName(raw: string): string {
|
||||
const text = this.normalizeContactRegionPart(raw)
|
||||
if (!text) return ''
|
||||
|
||||
const candidates = this.buildRegionLookupCandidates(text)
|
||||
for (const candidate of candidates) {
|
||||
const mapped = CONTACT_REGION_LOOKUP_DATA.countryNameByKey[candidate]
|
||||
if (mapped) return mapped
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
private toChineseProvinceName(raw: string): string {
|
||||
const text = this.normalizeContactRegionPart(raw)
|
||||
if (!text) return ''
|
||||
|
||||
const candidates = this.buildRegionLookupCandidates(text)
|
||||
if (candidates.length === 0) return text
|
||||
const provinceKey = this.resolveProvinceLookupKey(text)
|
||||
const mappedFromCandidates = candidates
|
||||
.map((candidate) => CONTACT_REGION_LOOKUP_DATA.provinceNameByKey[candidate])
|
||||
.find(Boolean)
|
||||
const mapped = CONTACT_REGION_LOOKUP_DATA.provinceNameByKey[provinceKey] || mappedFromCandidates
|
||||
if (mapped) return mapped
|
||||
|
||||
if (/[\u4e00-\u9fa5]/.test(text)) {
|
||||
return this.normalizeChineseProvinceName(text) || text
|
||||
}
|
||||
|
||||
return text
|
||||
}
|
||||
|
||||
private toChineseCityName(raw: string, provinceRaw?: string): string {
|
||||
const text = this.normalizeContactRegionPart(raw)
|
||||
if (!text) return ''
|
||||
|
||||
const candidates = this.buildRegionLookupCandidates(text)
|
||||
if (candidates.length === 0) return text
|
||||
|
||||
const provinceKey = this.resolveProvinceLookupKey(String(provinceRaw || ''))
|
||||
if (provinceKey) {
|
||||
const byProvince = CONTACT_REGION_LOOKUP_DATA.cityNameByProvinceKey[provinceKey]
|
||||
if (byProvince) {
|
||||
for (const candidate of candidates) {
|
||||
const mappedInProvince = byProvince[candidate]
|
||||
if (mappedInProvince) return mappedInProvince
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const candidate of candidates) {
|
||||
const mapped = CONTACT_REGION_LOOKUP_DATA.cityNameByKey[candidate]
|
||||
if (mapped) return mapped
|
||||
}
|
||||
|
||||
if (/[\u4e00-\u9fa5]/.test(text)) {
|
||||
return this.normalizeChineseCityName(text) || text
|
||||
}
|
||||
|
||||
return text
|
||||
}
|
||||
|
||||
private toChineseRegionText(raw: string): string {
|
||||
const text = this.normalizeContactRegionPart(raw)
|
||||
if (!text) return ''
|
||||
const tokens = text
|
||||
.split(/[\s,,、/|·]+/)
|
||||
.map((item) => this.normalizeContactRegionPart(item))
|
||||
.filter(Boolean)
|
||||
if (tokens.length === 0) return text
|
||||
|
||||
let provinceContext = ''
|
||||
const mapped = tokens.map((token) => {
|
||||
const country = this.toChineseCountryName(token)
|
||||
if (country !== token) return country
|
||||
|
||||
const province = this.toChineseProvinceName(token)
|
||||
if (province !== token) {
|
||||
provinceContext = province
|
||||
return province
|
||||
}
|
||||
|
||||
const city = this.toChineseCityName(token, provinceContext)
|
||||
if (city !== token) return city
|
||||
|
||||
return token
|
||||
})
|
||||
return mapped.join(' ').trim()
|
||||
}
|
||||
|
||||
private shouldHideCountryInRegion(country: string, hasProvinceOrCity: boolean): boolean {
|
||||
if (!country) return true
|
||||
const normalized = country.toLowerCase()
|
||||
if (normalized === 'cn' || normalized === 'chn' || normalized === 'china' || normalized === '中国') {
|
||||
return hasProvinceOrCity
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private getContactRegion(row: Record<string, any>): string {
|
||||
const pickByTokens = (tokens: string[]): string => {
|
||||
for (const [key, value] of Object.entries(row || {})) {
|
||||
const normalizedKey = String(key || '').toLowerCase()
|
||||
if (!normalizedKey) continue
|
||||
if (normalizedKey.includes('avatar') || normalizedKey.includes('img') || normalizedKey.includes('head')) continue
|
||||
if (!tokens.some((token) => normalizedKey.includes(token))) continue
|
||||
const text = this.normalizeContactRegionPart(value)
|
||||
if (text) return text
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
const directCountry = this.normalizeContactRegionPart(this.getRowField(row, ['country', 'Country'])) || pickByTokens(['country'])
|
||||
const directProvince = this.normalizeContactRegionPart(this.getRowField(row, ['province', 'Province'])) || pickByTokens(['province'])
|
||||
const directCity = this.normalizeContactRegionPart(this.getRowField(row, ['city', 'City'])) || pickByTokens(['city'])
|
||||
const directRegion =
|
||||
this.normalizeContactRegionPart(this.getRowField(row, ['region', 'Region', 'location', 'area'])) ||
|
||||
pickByTokens(['region', 'location', 'area', 'addr', 'address'])
|
||||
|
||||
if (directRegion) {
|
||||
const normalizedRegion = this.toChineseRegionText(directRegion)
|
||||
const parts = normalizedRegion
|
||||
.split(/\s+/)
|
||||
.map((item) => this.normalizeContactRegionPart(item))
|
||||
.filter(Boolean)
|
||||
if (parts.length > 1 && this.shouldHideCountryInRegion(parts[0], true)) {
|
||||
return parts.slice(1).join(' ').trim()
|
||||
}
|
||||
return normalizedRegion
|
||||
}
|
||||
|
||||
const fallbackCountry = this.normalizeContactRegionPart(this.extractExtraBufferTopLevelFieldStrings(row, 5)[0] || '')
|
||||
const fallbackProvince = this.normalizeContactRegionPart(this.extractExtraBufferTopLevelFieldStrings(row, 6)[0] || '')
|
||||
const fallbackCity = this.normalizeContactRegionPart(this.extractExtraBufferTopLevelFieldStrings(row, 7)[0] || '')
|
||||
|
||||
const country = this.toChineseCountryName(directCountry || fallbackCountry)
|
||||
const province = this.toChineseProvinceName(directProvince || fallbackProvince)
|
||||
const city = this.toChineseCityName(directCity || fallbackCity, directProvince || fallbackProvince)
|
||||
|
||||
const hasProvinceOrCity = Boolean(province || city)
|
||||
const parts: string[] = []
|
||||
if (!this.shouldHideCountryInRegion(country, hasProvinceOrCity)) {
|
||||
parts.push(country)
|
||||
}
|
||||
if (province) {
|
||||
parts.push(province)
|
||||
}
|
||||
if (city && city !== province) {
|
||||
parts.push(city)
|
||||
}
|
||||
|
||||
return parts.join(' ').trim()
|
||||
}
|
||||
|
||||
private normalizeUnsignedIntegerToken(raw: any): string | undefined {
|
||||
if (raw === undefined || raw === null || raw === '') return undefined
|
||||
|
||||
@@ -5096,14 +5737,35 @@ class ChatService {
|
||||
}
|
||||
|
||||
// 如果是群聊,尝试获取群昵称
|
||||
let groupNicknames: Record<string, string> = {}
|
||||
const groupNicknames = new Map<string, string>()
|
||||
if (chatroomId.endsWith('@chatroom')) {
|
||||
const nickResult = await wcdbService.getGroupNicknames(chatroomId)
|
||||
if (nickResult.success && nickResult.nicknames) {
|
||||
groupNicknames = nickResult.nicknames
|
||||
const nicknameBuckets = new Map<string, Set<string>>()
|
||||
for (const [memberIdRaw, nicknameRaw] of Object.entries(nickResult.nicknames)) {
|
||||
const memberId = String(memberIdRaw || '').trim().toLowerCase()
|
||||
const nickname = String(nicknameRaw || '').trim()
|
||||
if (!memberId || !nickname) continue
|
||||
const slot = nicknameBuckets.get(memberId)
|
||||
if (slot) {
|
||||
slot.add(nickname)
|
||||
} else {
|
||||
nicknameBuckets.set(memberId, new Set([nickname]))
|
||||
}
|
||||
}
|
||||
for (const [memberId, nicknameSet] of nicknameBuckets.entries()) {
|
||||
if (nicknameSet.size !== 1) continue
|
||||
groupNicknames.set(memberId, Array.from(nicknameSet)[0])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const lookupGroupNickname = (username?: string | null): string => {
|
||||
const key = String(username || '').trim().toLowerCase()
|
||||
if (!key) return ''
|
||||
return groupNicknames.get(key) || ''
|
||||
}
|
||||
|
||||
// 获取当前用户 wxid,用于识别"自己"
|
||||
const myWxid = this.configService.get('myWxid')
|
||||
const cleanedMyWxid = myWxid ? this.cleanAccountDirName(myWxid) : ''
|
||||
@@ -5113,7 +5775,7 @@ class ChatService {
|
||||
// 特判:如果是当前用户自己(contact 表通常不包含自己)
|
||||
if (myWxid && (username === myWxid || username === cleanedMyWxid)) {
|
||||
// 先查群昵称中是否有自己
|
||||
const myGroupNick = groupNicknames[username]
|
||||
const myGroupNick = lookupGroupNickname(username) || lookupGroupNickname(myWxid)
|
||||
if (myGroupNick) return myGroupNick
|
||||
// 尝试从缓存获取自己的昵称
|
||||
const cached = this.avatarCache.get(username) || this.avatarCache.get(myWxid)
|
||||
@@ -5122,7 +5784,7 @@ class ChatService {
|
||||
}
|
||||
|
||||
// 先查群昵称
|
||||
const groupNick = groupNicknames[username]
|
||||
const groupNick = lookupGroupNickname(username)
|
||||
if (groupNick) return groupNick
|
||||
|
||||
// 再查联系人信息
|
||||
|
||||
@@ -52,13 +52,17 @@ interface ConfigSchema {
|
||||
notificationFilterMode: 'all' | 'whitelist' | 'blacklist'
|
||||
notificationFilterList: string[]
|
||||
messagePushEnabled: boolean
|
||||
httpApiEnabled: boolean
|
||||
httpApiPort: number
|
||||
httpApiHost: string
|
||||
httpApiToken: string
|
||||
windowCloseBehavior: 'ask' | 'tray' | 'quit'
|
||||
quoteLayout: 'quote-top' | 'quote-bottom'
|
||||
wordCloudExcludeWords: string[]
|
||||
}
|
||||
|
||||
// 需要 safeStorage 加密的字段(普通模式)
|
||||
const ENCRYPTED_STRING_KEYS: Set<string> = new Set(['decryptKey', 'imageAesKey', 'authPassword'])
|
||||
const ENCRYPTED_STRING_KEYS: Set<string> = new Set(['decryptKey', 'imageAesKey', 'authPassword', 'httpApiToken'])
|
||||
const ENCRYPTED_BOOL_KEYS: Set<string> = new Set(['authEnabled', 'authUseHello'])
|
||||
const ENCRYPTED_NUMBER_KEYS: Set<string> = new Set(['imageXorKey'])
|
||||
|
||||
@@ -119,6 +123,10 @@ export class ConfigService {
|
||||
notificationPosition: 'top-right',
|
||||
notificationFilterMode: 'all',
|
||||
notificationFilterList: [],
|
||||
httpApiToken: '',
|
||||
httpApiEnabled: false,
|
||||
httpApiPort: 5031,
|
||||
httpApiHost: '127.0.0.1',
|
||||
messagePushEnabled: false,
|
||||
windowCloseBehavior: 'ask',
|
||||
quoteLayout: 'quote-top',
|
||||
@@ -662,11 +670,9 @@ export class ConfigService {
|
||||
|
||||
// 即使 authEnabled 被删除/篡改,如果密钥是 lock: 格式,说明曾开启过应用锁
|
||||
const rawDecryptKey: any = this.store.get('decryptKey')
|
||||
if (typeof rawDecryptKey === 'string' && rawDecryptKey.startsWith(LOCK_PREFIX)) {
|
||||
return true
|
||||
}
|
||||
return typeof rawDecryptKey === 'string' && rawDecryptKey.startsWith(LOCK_PREFIX);
|
||||
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// === 工具方法 ===
|
||||
|
||||
@@ -93,6 +93,9 @@ class ContactExportService {
|
||||
displayName: c.displayName,
|
||||
remark: c.remark,
|
||||
nickname: c.nickname,
|
||||
alias: c.alias,
|
||||
labels: Array.isArray(c.labels) ? c.labels : [],
|
||||
detailDescription: c.detailDescription,
|
||||
type: c.type
|
||||
}))
|
||||
}
|
||||
@@ -103,12 +106,15 @@ class ContactExportService {
|
||||
* 导出为CSV格式
|
||||
*/
|
||||
private async exportToCSV(contacts: any[], outputPath: string): Promise<void> {
|
||||
const headers = ['用户名', '显示名称', '备注', '昵称', '类型']
|
||||
const headers = ['用户名', '显示名称', '备注', '昵称', '微信号', '标签', '详细描述', '类型']
|
||||
const rows = contacts.map(c => [
|
||||
c.username || '',
|
||||
c.displayName || '',
|
||||
c.remark || '',
|
||||
c.nickname || '',
|
||||
c.alias || '',
|
||||
Array.isArray(c.labels) ? c.labels.join(' | ') : '',
|
||||
c.detailDescription || '',
|
||||
this.getTypeLabel(c.type)
|
||||
])
|
||||
|
||||
@@ -137,9 +143,13 @@ class ContactExportService {
|
||||
lines.push(`NICKNAME:${c.nickname}`)
|
||||
}
|
||||
|
||||
// 备注
|
||||
if (c.remark) {
|
||||
lines.push(`NOTE:${c.remark}`)
|
||||
const noteParts = [
|
||||
c.remark ? String(c.remark) : '',
|
||||
Array.isArray(c.labels) && c.labels.length > 0 ? `标签: ${c.labels.join(', ')}` : '',
|
||||
c.detailDescription ? `详细描述: ${c.detailDescription}` : ''
|
||||
].filter(Boolean)
|
||||
if (noteParts.length > 0) {
|
||||
lines.push(`NOTE:${noteParts.join('\\n')}`)
|
||||
}
|
||||
|
||||
// 微信ID
|
||||
|
||||
@@ -0,0 +1,9440 @@
|
||||
// Auto-generated from province-city-china (8.5.8) + pypinyin (0.55.0).
|
||||
// Do not hand-edit this file.
|
||||
|
||||
export interface ContactRegionLookupData {
|
||||
countryNameByKey: Record<string, string>
|
||||
provinceNameByKey: Record<string, string>
|
||||
provinceKeyByName: Record<string, string>
|
||||
cityNameByProvinceKey: Record<string, Record<string, string>>
|
||||
cityNameByKey: Record<string, string>
|
||||
}
|
||||
|
||||
export const CONTACT_REGION_LOOKUP_DATA: ContactRegionLookupData = {
|
||||
"countryNameByKey": {
|
||||
"10": "南极洲",
|
||||
"100": "保加利亚",
|
||||
"104": "缅甸",
|
||||
"108": "布隆迪",
|
||||
"112": "白俄罗斯",
|
||||
"116": "柬埔寨",
|
||||
"12": "阿尔及利亚",
|
||||
"120": "喀麦隆",
|
||||
"124": "加拿大",
|
||||
"132": "佛得角",
|
||||
"136": "开曼群岛",
|
||||
"140": "中非",
|
||||
"144": "斯里兰卡",
|
||||
"148": "乍得",
|
||||
"152": "智利",
|
||||
"156": "中国",
|
||||
"16": "美属萨摩亚",
|
||||
"162": "圣诞岛",
|
||||
"166": "科科斯(基林)群岛",
|
||||
"170": "哥伦比亚",
|
||||
"174": "科摩罗",
|
||||
"175": "马约特",
|
||||
"178": "刚果(布)",
|
||||
"180": "刚果(金)",
|
||||
"184": "库克群岛",
|
||||
"188": "哥斯达黎加",
|
||||
"191": "克罗地亚",
|
||||
"192": "古巴",
|
||||
"196": "塞浦路斯",
|
||||
"20": "安道尔",
|
||||
"203": "捷克",
|
||||
"204": "贝宁",
|
||||
"208": "丹麦",
|
||||
"212": "多米尼克",
|
||||
"214": "多米尼加",
|
||||
"218": "厄瓜多尔",
|
||||
"222": "萨尔瓦多",
|
||||
"226": "赤道几内亚",
|
||||
"231": "埃塞俄比亚",
|
||||
"232": "厄立特里亚",
|
||||
"233": "爱沙尼亚",
|
||||
"234": "法罗群岛",
|
||||
"238": "福克兰群岛(马尔维纳斯)",
|
||||
"239": "南乔治亚岛和南桑德韦奇岛",
|
||||
"24": "安哥拉",
|
||||
"242": "斐济",
|
||||
"246": "芬兰",
|
||||
"248": "奥兰群岛",
|
||||
"250": "法国",
|
||||
"254": "法属圭亚那",
|
||||
"258": "法属波利尼西亚",
|
||||
"260": "法属南部领地",
|
||||
"262": "吉布提",
|
||||
"266": "加蓬",
|
||||
"268": "格鲁吉亚",
|
||||
"270": "冈比亚",
|
||||
"275": "巴勒斯坦",
|
||||
"276": "德国",
|
||||
"28": "安提瓜和巴布达",
|
||||
"288": "加纳",
|
||||
"292": "直布罗陀",
|
||||
"296": "基里巴斯",
|
||||
"300": "希腊",
|
||||
"304": "格陵兰",
|
||||
"308": "格林纳达",
|
||||
"31": "阿塞拜疆",
|
||||
"312": "瓜德罗普",
|
||||
"316": "关岛",
|
||||
"32": "阿根廷",
|
||||
"320": "危地马拉",
|
||||
"324": "几内亚",
|
||||
"328": "圭亚那",
|
||||
"332": "海地",
|
||||
"334": "赫德岛和麦克唐纳岛",
|
||||
"336": "梵蒂冈",
|
||||
"340": "洪都拉斯",
|
||||
"348": "匈牙利",
|
||||
"352": "冰岛",
|
||||
"356": "印度",
|
||||
"36": "澳大利亚",
|
||||
"360": "印度尼西亚",
|
||||
"364": "伊朗",
|
||||
"368": "伊拉克",
|
||||
"372": "爱尔兰",
|
||||
"376": "以色列",
|
||||
"380": "意大利",
|
||||
"384": "科特迪瓦",
|
||||
"388": "牙买加",
|
||||
"392": "日本",
|
||||
"398": "哈萨克斯坦",
|
||||
"4": "阿富汗",
|
||||
"40": "奥地利",
|
||||
"400": "约旦",
|
||||
"404": "肯尼亚",
|
||||
"408": "朝鲜",
|
||||
"410": "韩国",
|
||||
"414": "科威特",
|
||||
"417": "吉尔吉斯斯坦",
|
||||
"418": "老挝",
|
||||
"422": "黎巴嫩",
|
||||
"426": "莱索托",
|
||||
"428": "拉脱维亚",
|
||||
"430": "利比里亚",
|
||||
"434": "利比亚",
|
||||
"438": "列支敦士登",
|
||||
"44": "巴哈马",
|
||||
"440": "立陶宛",
|
||||
"442": "卢森堡",
|
||||
"450": "马达加斯加",
|
||||
"454": "马拉维",
|
||||
"458": "马来西亚",
|
||||
"462": "马尔代夫",
|
||||
"466": "马里",
|
||||
"470": "马耳他",
|
||||
"474": "马提尼克",
|
||||
"478": "毛利塔尼亚",
|
||||
"48": "巴林",
|
||||
"480": "毛里求斯",
|
||||
"484": "墨西哥",
|
||||
"492": "摩纳哥",
|
||||
"496": "蒙古",
|
||||
"498": "摩尔多瓦",
|
||||
"499": "黑山",
|
||||
"50": "孟加拉国",
|
||||
"500": "蒙特塞拉特",
|
||||
"504": "摩洛哥",
|
||||
"508": "莫桑比克",
|
||||
"51": "亚美尼亚",
|
||||
"512": "阿曼",
|
||||
"516": "纳米比亚",
|
||||
"52": "巴巴多斯",
|
||||
"520": "瑙鲁",
|
||||
"524": "尼泊尔",
|
||||
"528": "荷兰",
|
||||
"530": "荷属安的列斯",
|
||||
"533": "阿鲁巴",
|
||||
"540": "新喀里多尼亚",
|
||||
"548": "瓦努阿图",
|
||||
"554": "新西兰",
|
||||
"558": "尼加拉瓜",
|
||||
"56": "比利时",
|
||||
"562": "尼日尔",
|
||||
"566": "尼日利亚",
|
||||
"570": "纽埃",
|
||||
"574": "诺福克岛",
|
||||
"578": "挪威",
|
||||
"580": "北马里亚纳",
|
||||
"581": "美国本土外小岛屿",
|
||||
"583": "密克罗尼西亚联邦",
|
||||
"584": "马绍尔群岛",
|
||||
"585": "帕劳",
|
||||
"586": "巴基斯坦",
|
||||
"591": "巴拿马",
|
||||
"598": "巴布亚新几内亚",
|
||||
"60": "百慕大",
|
||||
"600": "巴拉圭",
|
||||
"604": "秘鲁",
|
||||
"608": "菲律宾",
|
||||
"612": "皮特凯恩",
|
||||
"616": "波兰",
|
||||
"620": "葡萄牙",
|
||||
"624": "几内亚比绍",
|
||||
"626": "东帝汶",
|
||||
"630": "波多黎各",
|
||||
"634": "卡塔尔",
|
||||
"638": "留尼汪",
|
||||
"64": "不丹",
|
||||
"642": "罗马尼亚",
|
||||
"643": "俄罗斯联邦",
|
||||
"646": "卢旺达",
|
||||
"654": "圣赫勒拿",
|
||||
"659": "圣基茨和尼维斯",
|
||||
"660": "安圭拉",
|
||||
"662": "圣卢西亚",
|
||||
"666": "圣皮埃尔和密克隆",
|
||||
"670": "圣文森特和格林纳丁斯",
|
||||
"674": "圣马力诺",
|
||||
"678": "圣多美和普林西比",
|
||||
"68": "玻利维亚",
|
||||
"682": "沙特阿拉伯",
|
||||
"686": "塞内加尔",
|
||||
"688": "塞尔维亚",
|
||||
"690": "塞舌尔",
|
||||
"694": "塞拉利昂",
|
||||
"70": "波黑",
|
||||
"702": "新加坡",
|
||||
"703": "斯洛伐克",
|
||||
"704": "越南",
|
||||
"705": "斯洛文尼亚",
|
||||
"706": "索马里",
|
||||
"710": "南非",
|
||||
"716": "津巴布韦",
|
||||
"72": "博茨瓦纳",
|
||||
"724": "西班牙",
|
||||
"732": "西撒哈拉",
|
||||
"736": "苏丹",
|
||||
"74": "布维岛",
|
||||
"740": "苏里南",
|
||||
"744": "斯瓦尔巴岛和扬马延岛",
|
||||
"748": "斯威士兰",
|
||||
"752": "瑞典",
|
||||
"756": "瑞士",
|
||||
"76": "巴西",
|
||||
"760": "叙利亚",
|
||||
"762": "塔吉克斯坦",
|
||||
"764": "泰国",
|
||||
"768": "多哥",
|
||||
"772": "托克劳",
|
||||
"776": "汤加",
|
||||
"780": "特立尼达和多巴哥",
|
||||
"784": "阿联酋",
|
||||
"788": "突尼斯",
|
||||
"792": "土耳其",
|
||||
"795": "土库曼斯坦",
|
||||
"796": "特克斯和凯科斯群岛",
|
||||
"798": "图瓦卢",
|
||||
"8": "阿尔巴尼亚",
|
||||
"800": "乌干达",
|
||||
"804": "乌克兰",
|
||||
"807": "前南马其顿",
|
||||
"818": "埃及",
|
||||
"826": "英国",
|
||||
"831": "格恩西岛",
|
||||
"832": "泽西岛",
|
||||
"833": "英国属地曼岛",
|
||||
"834": "坦桑尼亚",
|
||||
"84": "伯利兹",
|
||||
"840": "美国",
|
||||
"850": "美属维尔京群岛",
|
||||
"854": "布基纳法索",
|
||||
"858": "乌拉圭",
|
||||
"86": "英属印度洋领地",
|
||||
"860": "乌兹别克斯坦",
|
||||
"862": "委内瑞拉",
|
||||
"876": "瓦利斯和富图纳",
|
||||
"882": "萨摩亚",
|
||||
"887": "也门",
|
||||
"894": "赞比亚",
|
||||
"90": "所罗门群岛",
|
||||
"92": "英属维尔京群岛",
|
||||
"96": "文莱",
|
||||
"abw": "阿鲁巴",
|
||||
"ad": "安道尔",
|
||||
"ae": "阿联酋",
|
||||
"af": "阿富汗",
|
||||
"afg": "阿富汗",
|
||||
"afghanistan": "阿富汗",
|
||||
"ag": "安提瓜和巴布达",
|
||||
"ago": "安哥拉",
|
||||
"ai": "安圭拉",
|
||||
"aia": "安圭拉",
|
||||
"al": "阿尔巴尼亚",
|
||||
"ala": "奥兰群岛",
|
||||
"alandislands": "奥兰群岛",
|
||||
"alb": "阿尔巴尼亚",
|
||||
"albania": "阿尔巴尼亚",
|
||||
"algeria": "阿尔及利亚",
|
||||
"am": "亚美尼亚",
|
||||
"americansamoa": "美属萨摩亚",
|
||||
"an": "荷属安的列斯",
|
||||
"and": "安道尔",
|
||||
"andorra": "安道尔",
|
||||
"angola": "安哥拉",
|
||||
"anguilla": "安圭拉",
|
||||
"ant": "荷属安的列斯",
|
||||
"antarctica": "南极洲",
|
||||
"antiguaandbarbuda": "安提瓜和巴布达",
|
||||
"ao": "安哥拉",
|
||||
"aq": "南极洲",
|
||||
"ar": "阿根廷",
|
||||
"arabrepublicofegypt": "埃及",
|
||||
"are": "阿联酋",
|
||||
"arg": "阿根廷",
|
||||
"argentina": "阿根廷",
|
||||
"argentinerepublic": "阿根廷",
|
||||
"arm": "亚美尼亚",
|
||||
"armenia": "亚美尼亚",
|
||||
"aruba": "阿鲁巴",
|
||||
"as": "美属萨摩亚",
|
||||
"asm": "美属萨摩亚",
|
||||
"at": "奥地利",
|
||||
"ata": "南极洲",
|
||||
"atf": "法属南部领地",
|
||||
"atg": "安提瓜和巴布达",
|
||||
"au": "澳大利亚",
|
||||
"aus": "澳大利亚",
|
||||
"australia": "澳大利亚",
|
||||
"austria": "奥地利",
|
||||
"aut": "奥地利",
|
||||
"aw": "阿鲁巴",
|
||||
"ax": "奥兰群岛",
|
||||
"az": "阿塞拜疆",
|
||||
"aze": "阿塞拜疆",
|
||||
"azerbaijan": "阿塞拜疆",
|
||||
"ba": "波黑",
|
||||
"bahamas": "巴哈马",
|
||||
"bahamasthe": "巴哈马",
|
||||
"bahrain": "巴林",
|
||||
"bangladesh": "孟加拉国",
|
||||
"barbados": "巴巴多斯",
|
||||
"bb": "巴巴多斯",
|
||||
"bd": "孟加拉国",
|
||||
"bdi": "布隆迪",
|
||||
"be": "比利时",
|
||||
"bel": "比利时",
|
||||
"belarus": "白俄罗斯",
|
||||
"belgium": "比利时",
|
||||
"belize": "伯利兹",
|
||||
"ben": "贝宁",
|
||||
"benin": "贝宁",
|
||||
"bermuda": "百慕大",
|
||||
"bf": "布基纳法索",
|
||||
"bfa": "布基纳法索",
|
||||
"bg": "保加利亚",
|
||||
"bgd": "孟加拉国",
|
||||
"bgr": "保加利亚",
|
||||
"bh": "巴林",
|
||||
"bhr": "巴林",
|
||||
"bhs": "巴哈马",
|
||||
"bhutan": "不丹",
|
||||
"bi": "布隆迪",
|
||||
"bih": "波黑",
|
||||
"bj": "贝宁",
|
||||
"blr": "白俄罗斯",
|
||||
"blz": "伯利兹",
|
||||
"bm": "百慕大",
|
||||
"bmu": "百慕大",
|
||||
"bn": "文莱",
|
||||
"bo": "玻利维亚",
|
||||
"bol": "玻利维亚",
|
||||
"bolivarianrepublicofvenezuela": "委内瑞拉",
|
||||
"bolivia": "玻利维亚",
|
||||
"bosniaandherzegovina": "波黑",
|
||||
"botswana": "博茨瓦纳",
|
||||
"bouvetisland": "布维岛",
|
||||
"br": "巴西",
|
||||
"bra": "巴西",
|
||||
"brazil": "巴西",
|
||||
"brb": "巴巴多斯",
|
||||
"britishindianoceanterritory": "英属印度洋领地",
|
||||
"britishindianoceanterritorythe": "英属印度洋领地",
|
||||
"britishvirginislands": "英属维尔京群岛",
|
||||
"britishvirginislandsthe": "英属维尔京群岛",
|
||||
"brn": "文莱",
|
||||
"bruneidarussalam": "文莱",
|
||||
"bs": "巴哈马",
|
||||
"bt": "不丹",
|
||||
"btn": "不丹",
|
||||
"bulgaria": "保加利亚",
|
||||
"burkinafaso": "布基纳法索",
|
||||
"burundi": "布隆迪",
|
||||
"bv": "布维岛",
|
||||
"bvt": "布维岛",
|
||||
"bw": "博茨瓦纳",
|
||||
"bwa": "博茨瓦纳",
|
||||
"by": "白俄罗斯",
|
||||
"bz": "伯利兹",
|
||||
"ca": "加拿大",
|
||||
"caf": "中非",
|
||||
"cambodia": "柬埔寨",
|
||||
"cameroon": "喀麦隆",
|
||||
"can": "加拿大",
|
||||
"canada": "加拿大",
|
||||
"capeverde": "佛得角",
|
||||
"caymanislands": "开曼群岛",
|
||||
"caymanislandsthe": "开曼群岛",
|
||||
"cc": "科科斯(基林)群岛",
|
||||
"cck": "科科斯(基林)群岛",
|
||||
"cd": "刚果(金)",
|
||||
"centralafricanrepublic": "中非",
|
||||
"centralafricanrepublicthe": "中非",
|
||||
"cf": "中非",
|
||||
"cg": "刚果(布)",
|
||||
"ch": "瑞士",
|
||||
"chad": "乍得",
|
||||
"che": "瑞士",
|
||||
"chile": "智利",
|
||||
"china": "中国",
|
||||
"chl": "智利",
|
||||
"chn": "中国",
|
||||
"christmasisland": "圣诞岛",
|
||||
"ci": "科特迪瓦",
|
||||
"civ": "科特迪瓦",
|
||||
"ck": "库克群岛",
|
||||
"cl": "智利",
|
||||
"cm": "喀麦隆",
|
||||
"cmr": "喀麦隆",
|
||||
"cn": "中国",
|
||||
"co": "哥伦比亚",
|
||||
"cocoskeelingislands": "科科斯(基林)群岛",
|
||||
"cocoskeelingislandsthe": "科科斯(基林)群岛",
|
||||
"cod": "刚果(金)",
|
||||
"cog": "刚果(布)",
|
||||
"cok": "库克群岛",
|
||||
"col": "哥伦比亚",
|
||||
"colombia": "哥伦比亚",
|
||||
"com": "科摩罗",
|
||||
"commonwealthofbahamas": "巴哈马",
|
||||
"commonwealthofdominica": "多米尼克",
|
||||
"commonwealthofnorrnmarianaislands": "北马里亚纳",
|
||||
"comoros": "科摩罗",
|
||||
"congo": "刚果(布)",
|
||||
"congodemocraticrepublicof": "刚果(金)",
|
||||
"congothedemocraticrepublicofthe": "刚果(金)",
|
||||
"cookislands": "库克群岛",
|
||||
"cookislandsthe": "库克群岛",
|
||||
"costarica": "哥斯达黎加",
|
||||
"cpv": "佛得角",
|
||||
"cr": "哥斯达黎加",
|
||||
"cri": "哥斯达黎加",
|
||||
"croatia": "克罗地亚",
|
||||
"ctedivoire": "科特迪瓦",
|
||||
"cu": "古巴",
|
||||
"cub": "古巴",
|
||||
"cuba": "古巴",
|
||||
"cv": "佛得角",
|
||||
"cx": "圣诞岛",
|
||||
"cxr": "圣诞岛",
|
||||
"cy": "塞浦路斯",
|
||||
"cym": "开曼群岛",
|
||||
"cyp": "塞浦路斯",
|
||||
"cyprus": "塞浦路斯",
|
||||
"cz": "捷克",
|
||||
"cze": "捷克",
|
||||
"czechrepublic": "捷克",
|
||||
"czechrepublicthe": "捷克",
|
||||
"de": "德国",
|
||||
"democraticpeoplesrepublicofkorea": "朝鲜",
|
||||
"democraticrepublicofcongo": "刚果(金)",
|
||||
"democraticrepublicofsaotomeandprincipe": "圣多美和普林西比",
|
||||
"democraticrepublicoftimorleste": "东帝汶",
|
||||
"democraticsocialistrepublicofsrilanka": "斯里兰卡",
|
||||
"denmark": "丹麦",
|
||||
"deu": "德国",
|
||||
"dj": "吉布提",
|
||||
"dji": "吉布提",
|
||||
"djibouti": "吉布提",
|
||||
"dk": "丹麦",
|
||||
"dm": "多米尼克",
|
||||
"dma": "多米尼克",
|
||||
"dnk": "丹麦",
|
||||
"do": "多米尼加",
|
||||
"dom": "多米尼加",
|
||||
"dominica": "多米尼克",
|
||||
"dominicanrepublic": "多米尼加",
|
||||
"dominicanrepublicthe": "多米尼加",
|
||||
"dz": "阿尔及利亚",
|
||||
"dza": "阿尔及利亚",
|
||||
"easternrepublicofuruguay": "乌拉圭",
|
||||
"ec": "厄瓜多尔",
|
||||
"ecu": "厄瓜多尔",
|
||||
"ecuador": "厄瓜多尔",
|
||||
"ee": "爱沙尼亚",
|
||||
"eg": "埃及",
|
||||
"egy": "埃及",
|
||||
"egypt": "埃及",
|
||||
"eh": "西撒哈拉",
|
||||
"elsalvador": "萨尔瓦多",
|
||||
"equatorialguinea": "赤道几内亚",
|
||||
"er": "厄立特里亚",
|
||||
"eri": "厄立特里亚",
|
||||
"eritrea": "厄立特里亚",
|
||||
"es": "西班牙",
|
||||
"esh": "西撒哈拉",
|
||||
"esp": "西班牙",
|
||||
"est": "爱沙尼亚",
|
||||
"estonia": "爱沙尼亚",
|
||||
"et": "埃塞俄比亚",
|
||||
"eth": "埃塞俄比亚",
|
||||
"ethiopia": "埃塞俄比亚",
|
||||
"falklandislandsmalvinas": "福克兰群岛(马尔维纳斯)",
|
||||
"falklandislandsthemalvinas": "福克兰群岛(马尔维纳斯)",
|
||||
"faroeislands": "法罗群岛",
|
||||
"faroeislandsthe": "法罗群岛",
|
||||
"federaldemocraticrepublicofethiopia": "埃塞俄比亚",
|
||||
"federalrepublicofnigeria": "尼日利亚",
|
||||
"federatedstatesofmicronesia": "密克罗尼西亚联邦",
|
||||
"federativerepublicofbrazil": "巴西",
|
||||
"fi": "芬兰",
|
||||
"fiji": "斐济",
|
||||
"fin": "芬兰",
|
||||
"finland": "芬兰",
|
||||
"fj": "斐济",
|
||||
"fji": "斐济",
|
||||
"fk": "福克兰群岛(马尔维纳斯)",
|
||||
"flk": "福克兰群岛(马尔维纳斯)",
|
||||
"fm": "密克罗尼西亚联邦",
|
||||
"fo": "法罗群岛",
|
||||
"formeryugoslavrepublicofmacedonia": "前南马其顿",
|
||||
"fr": "法国",
|
||||
"fra": "法国",
|
||||
"france": "法国",
|
||||
"frenchguiana": "法属圭亚那",
|
||||
"frenchpolynesia": "法属波利尼西亚",
|
||||
"frenchrepublic": "法国",
|
||||
"frenchsournterritories": "法属南部领地",
|
||||
"frenchsouthernterritoriesthe": "法属南部领地",
|
||||
"fro": "法罗群岛",
|
||||
"fsm": "密克罗尼西亚联邦",
|
||||
"ga": "加蓬",
|
||||
"gab": "加蓬",
|
||||
"gabon": "加蓬",
|
||||
"gaboneserepublic": "加蓬",
|
||||
"gambia": "冈比亚",
|
||||
"gambiathe": "冈比亚",
|
||||
"gb": "英国",
|
||||
"gbr": "英国",
|
||||
"gd": "格林纳达",
|
||||
"ge": "格鲁吉亚",
|
||||
"geo": "格鲁吉亚",
|
||||
"georgia": "格鲁吉亚",
|
||||
"germany": "德国",
|
||||
"gf": "法属圭亚那",
|
||||
"gg": "格恩西岛",
|
||||
"ggy": "格恩西岛",
|
||||
"gh": "加纳",
|
||||
"gha": "加纳",
|
||||
"ghana": "加纳",
|
||||
"gi": "直布罗陀",
|
||||
"gib": "直布罗陀",
|
||||
"gibraltar": "直布罗陀",
|
||||
"gin": "几内亚",
|
||||
"gl": "格陵兰",
|
||||
"glp": "瓜德罗普",
|
||||
"gm": "冈比亚",
|
||||
"gmb": "冈比亚",
|
||||
"gn": "几内亚",
|
||||
"gnb": "几内亚比绍",
|
||||
"gnq": "赤道几内亚",
|
||||
"gp": "瓜德罗普",
|
||||
"gq": "赤道几内亚",
|
||||
"gr": "希腊",
|
||||
"grandduchyofluxembourg": "卢森堡",
|
||||
"grc": "希腊",
|
||||
"grd": "格林纳达",
|
||||
"greece": "希腊",
|
||||
"greenland": "格陵兰",
|
||||
"grenada": "格林纳达",
|
||||
"grl": "格陵兰",
|
||||
"gs": "南乔治亚岛和南桑德韦奇岛",
|
||||
"gt": "危地马拉",
|
||||
"gtm": "危地马拉",
|
||||
"gu": "关岛",
|
||||
"guadeloupe": "瓜德罗普",
|
||||
"guam": "关岛",
|
||||
"guatemala": "危地马拉",
|
||||
"guernsey": "格恩西岛",
|
||||
"guf": "法属圭亚那",
|
||||
"guinea": "几内亚",
|
||||
"guineabissau": "几内亚比绍",
|
||||
"gum": "关岛",
|
||||
"guy": "圭亚那",
|
||||
"guyana": "圭亚那",
|
||||
"gw": "几内亚比绍",
|
||||
"gy": "圭亚那",
|
||||
"haiti": "海地",
|
||||
"hashemitekingdomofjordan": "约旦",
|
||||
"heardislandandmcdonaldislands": "赫德岛和麦克唐纳岛",
|
||||
"hefederalrepublicofgermany": "德国",
|
||||
"hellenicrepublic": "希腊",
|
||||
"herepublicofmontenegro": "黑山",
|
||||
"hestateofkuwait": "科威特",
|
||||
"hm": "赫德岛和麦克唐纳岛",
|
||||
"hmd": "赫德岛和麦克唐纳岛",
|
||||
"hn": "洪都拉斯",
|
||||
"hnd": "洪都拉斯",
|
||||
"holyseethevaticancitystate": "梵蒂冈",
|
||||
"holyseevaticancitystate": "梵蒂冈",
|
||||
"honduras": "洪都拉斯",
|
||||
"hr": "克罗地亚",
|
||||
"hrv": "克罗地亚",
|
||||
"ht": "海地",
|
||||
"hti": "海地",
|
||||
"hu": "匈牙利",
|
||||
"hun": "匈牙利",
|
||||
"hungary": "匈牙利",
|
||||
"iceland": "冰岛",
|
||||
"id": "印度尼西亚",
|
||||
"idn": "印度尼西亚",
|
||||
"ie": "爱尔兰",
|
||||
"il": "以色列",
|
||||
"im": "英国属地曼岛",
|
||||
"imn": "英国属地曼岛",
|
||||
"in": "印度",
|
||||
"ind": "印度",
|
||||
"independentstateofsamoa": "萨摩亚",
|
||||
"india": "印度",
|
||||
"indonesia": "印度尼西亚",
|
||||
"io": "英属印度洋领地",
|
||||
"iot": "英属印度洋领地",
|
||||
"iq": "伊拉克",
|
||||
"ir": "伊朗",
|
||||
"iranislamicrepublicof": "伊朗",
|
||||
"irantheislamicrepublicof": "伊朗",
|
||||
"iraq": "伊拉克",
|
||||
"ireland": "爱尔兰",
|
||||
"irl": "爱尔兰",
|
||||
"irn": "伊朗",
|
||||
"irq": "伊拉克",
|
||||
"is": "冰岛",
|
||||
"isl": "冰岛",
|
||||
"islamicrepublicofafghanistan": "阿富汗",
|
||||
"islamicrepublicofiran": "伊朗",
|
||||
"islamicrepublicofmauritania": "毛利塔尼亚",
|
||||
"islamicrepublicofpakistan": "巴基斯坦",
|
||||
"isleofman": "英国属地曼岛",
|
||||
"isr": "以色列",
|
||||
"israel": "以色列",
|
||||
"it": "意大利",
|
||||
"ita": "意大利",
|
||||
"italy": "意大利",
|
||||
"jam": "牙买加",
|
||||
"jamaica": "牙买加",
|
||||
"japan": "日本",
|
||||
"je": "泽西岛",
|
||||
"jersey": "泽西岛",
|
||||
"jey": "泽西岛",
|
||||
"jm": "牙买加",
|
||||
"jo": "约旦",
|
||||
"jor": "约旦",
|
||||
"jordan": "约旦",
|
||||
"jp": "日本",
|
||||
"jpn": "日本",
|
||||
"kaz": "哈萨克斯坦",
|
||||
"kazakhstan": "哈萨克斯坦",
|
||||
"ke": "肯尼亚",
|
||||
"ken": "肯尼亚",
|
||||
"kenya": "肯尼亚",
|
||||
"kg": "吉尔吉斯斯坦",
|
||||
"kgz": "吉尔吉斯斯坦",
|
||||
"kh": "柬埔寨",
|
||||
"khm": "柬埔寨",
|
||||
"ki": "基里巴斯",
|
||||
"kingdomofbahrain": "巴林",
|
||||
"kingdomofbelgium": "比利时",
|
||||
"kingdomofbhutan": "不丹",
|
||||
"kingdomofcambodia": "柬埔寨",
|
||||
"kingdomofdenmark": "丹麦",
|
||||
"kingdomoflesotho": "莱索托",
|
||||
"kingdomofmorocco": "摩洛哥",
|
||||
"kingdomofnerlands": "荷兰",
|
||||
"kingdomofnorway": "挪威",
|
||||
"kingdomofsaudiarabia": "沙特阿拉伯",
|
||||
"kingdomofspain": "西班牙",
|
||||
"kingdomofswaziland": "斯威士兰",
|
||||
"kingdomofsweden": "瑞典",
|
||||
"kingdomofthailand": "泰国",
|
||||
"kingdomoftonga": "汤加",
|
||||
"kir": "基里巴斯",
|
||||
"kiribati": "基里巴斯",
|
||||
"km": "科摩罗",
|
||||
"kn": "圣基茨和尼维斯",
|
||||
"kna": "圣基茨和尼维斯",
|
||||
"kor": "韩国",
|
||||
"koreademocraticpeoplesrepublicof": "朝鲜",
|
||||
"korearepublicof": "韩国",
|
||||
"koreathedemocraticpeoplesrepublicof": "朝鲜",
|
||||
"koreatherepublicof": "韩国",
|
||||
"kp": "朝鲜",
|
||||
"kr": "韩国",
|
||||
"kuwait": "科威特",
|
||||
"kw": "科威特",
|
||||
"kwt": "科威特",
|
||||
"ky": "开曼群岛",
|
||||
"kyrgyzrepublic": "吉尔吉斯斯坦",
|
||||
"kyrgyzstan": "吉尔吉斯斯坦",
|
||||
"kz": "哈萨克斯坦",
|
||||
"la": "老挝",
|
||||
"lao": "老挝",
|
||||
"laopeoplesdemocraticrepublic": "老挝",
|
||||
"laopeoplesdemocraticrepublicthe": "老挝",
|
||||
"latvia": "拉脱维亚",
|
||||
"lb": "黎巴嫩",
|
||||
"lbn": "黎巴嫩",
|
||||
"lbr": "利比里亚",
|
||||
"lby": "利比亚",
|
||||
"lc": "圣卢西亚",
|
||||
"lca": "圣卢西亚",
|
||||
"lebaneserepublic": "黎巴嫩",
|
||||
"lebanon": "黎巴嫩",
|
||||
"lesotho": "莱索托",
|
||||
"li": "列支敦士登",
|
||||
"liberia": "利比里亚",
|
||||
"libyanarabjamahiriya": "利比亚",
|
||||
"libyanarabjamahiriyathe": "利比亚",
|
||||
"lie": "列支敦士登",
|
||||
"liechtenstein": "列支敦士登",
|
||||
"lithuania": "立陶宛",
|
||||
"lk": "斯里兰卡",
|
||||
"lka": "斯里兰卡",
|
||||
"lr": "利比里亚",
|
||||
"ls": "莱索托",
|
||||
"lso": "莱索托",
|
||||
"lt": "立陶宛",
|
||||
"ltu": "立陶宛",
|
||||
"lu": "卢森堡",
|
||||
"lux": "卢森堡",
|
||||
"luxembourg": "卢森堡",
|
||||
"lv": "拉脱维亚",
|
||||
"lva": "拉脱维亚",
|
||||
"ly": "利比亚",
|
||||
"ma": "摩洛哥",
|
||||
"macedoniaformeryugoslavrepublicof": "前南马其顿",
|
||||
"macedoniatheformeryugoslavrepublicof": "前南马其顿",
|
||||
"madagascar": "马达加斯加",
|
||||
"malawi": "马拉维",
|
||||
"malaysia": "马来西亚",
|
||||
"maldives": "马尔代夫",
|
||||
"mali": "马里",
|
||||
"malta": "马耳他",
|
||||
"mar": "摩洛哥",
|
||||
"marshallislands": "马绍尔群岛",
|
||||
"marshallislandsthe": "马绍尔群岛",
|
||||
"martinique": "马提尼克",
|
||||
"mauritania": "毛利塔尼亚",
|
||||
"mauritius": "毛里求斯",
|
||||
"mayotte": "马约特",
|
||||
"mc": "摩纳哥",
|
||||
"mco": "摩纳哥",
|
||||
"md": "摩尔多瓦",
|
||||
"mda": "摩尔多瓦",
|
||||
"mdg": "马达加斯加",
|
||||
"mdv": "马尔代夫",
|
||||
"me": "黑山",
|
||||
"mex": "墨西哥",
|
||||
"mexico": "墨西哥",
|
||||
"mg": "马达加斯加",
|
||||
"mh": "马绍尔群岛",
|
||||
"mhl": "马绍尔群岛",
|
||||
"micronesiafederatedstatesof": "密克罗尼西亚联邦",
|
||||
"micronesiathefederatedstatesof": "密克罗尼西亚联邦",
|
||||
"mk": "前南马其顿",
|
||||
"mkd": "前南马其顿",
|
||||
"ml": "马里",
|
||||
"mli": "马里",
|
||||
"mlt": "马耳他",
|
||||
"mm": "缅甸",
|
||||
"mmr": "缅甸",
|
||||
"mn": "蒙古",
|
||||
"mne": "黑山",
|
||||
"mng": "蒙古",
|
||||
"mnp": "北马里亚纳",
|
||||
"moldovarepublicof": "摩尔多瓦",
|
||||
"moldovatherepublicof": "摩尔多瓦",
|
||||
"monaco": "摩纳哥",
|
||||
"mongolia": "蒙古",
|
||||
"montenegro": "黑山",
|
||||
"montserrat": "蒙特塞拉特",
|
||||
"morocco": "摩洛哥",
|
||||
"moz": "莫桑比克",
|
||||
"mozambique": "莫桑比克",
|
||||
"mp": "北马里亚纳",
|
||||
"mq": "马提尼克",
|
||||
"mr": "毛利塔尼亚",
|
||||
"mrt": "毛利塔尼亚",
|
||||
"ms": "蒙特塞拉特",
|
||||
"msr": "蒙特塞拉特",
|
||||
"mt": "马耳他",
|
||||
"mtq": "马提尼克",
|
||||
"mu": "毛里求斯",
|
||||
"mus": "毛里求斯",
|
||||
"mv": "马尔代夫",
|
||||
"mw": "马拉维",
|
||||
"mwi": "马拉维",
|
||||
"mx": "墨西哥",
|
||||
"my": "马来西亚",
|
||||
"myanmar": "缅甸",
|
||||
"mys": "马来西亚",
|
||||
"myt": "马约特",
|
||||
"mz": "莫桑比克",
|
||||
"na": "纳米比亚",
|
||||
"nam": "纳米比亚",
|
||||
"namibia": "纳米比亚",
|
||||
"nauru": "瑙鲁",
|
||||
"nc": "新喀里多尼亚",
|
||||
"ncl": "新喀里多尼亚",
|
||||
"ne": "尼日尔",
|
||||
"nepal": "尼泊尔",
|
||||
"ner": "尼日尔",
|
||||
"nerlands": "荷兰",
|
||||
"nerlandsantilles": "荷属安的列斯",
|
||||
"netherlandsantillesthe": "荷属安的列斯",
|
||||
"netherlandsthe": "荷兰",
|
||||
"newcaledonia": "新喀里多尼亚",
|
||||
"newzealand": "新西兰",
|
||||
"nf": "诺福克岛",
|
||||
"nfk": "诺福克岛",
|
||||
"ng": "尼日利亚",
|
||||
"nga": "尼日利亚",
|
||||
"ni": "尼加拉瓜",
|
||||
"nic": "尼加拉瓜",
|
||||
"nicaragua": "尼加拉瓜",
|
||||
"niger": "尼日尔",
|
||||
"nigeria": "尼日利亚",
|
||||
"nigerthe": "尼日尔",
|
||||
"niu": "纽埃",
|
||||
"niue": "纽埃",
|
||||
"nl": "荷兰",
|
||||
"nld": "荷兰",
|
||||
"no": "挪威",
|
||||
"nor": "挪威",
|
||||
"norfolkisland": "诺福克岛",
|
||||
"norrnmarianaislands": "北马里亚纳",
|
||||
"northernmarianaislandsthe": "北马里亚纳",
|
||||
"norway": "挪威",
|
||||
"np": "尼泊尔",
|
||||
"npl": "尼泊尔",
|
||||
"nr": "瑙鲁",
|
||||
"nru": "瑙鲁",
|
||||
"nu": "纽埃",
|
||||
"nz": "新西兰",
|
||||
"nzl": "新西兰",
|
||||
"occupiedpalestinianterritory": "巴勒斯坦",
|
||||
"om": "阿曼",
|
||||
"oman": "阿曼",
|
||||
"omn": "阿曼",
|
||||
"pa": "巴拿马",
|
||||
"pak": "巴基斯坦",
|
||||
"pakistan": "巴基斯坦",
|
||||
"palau": "帕劳",
|
||||
"palestinianterritoryoccupied": "巴勒斯坦",
|
||||
"palestinianterritorytheoccupied": "巴勒斯坦",
|
||||
"pan": "巴拿马",
|
||||
"panama": "巴拿马",
|
||||
"papuanewguinea": "巴布亚新几内亚",
|
||||
"paraguay": "巴拉圭",
|
||||
"pcn": "皮特凯恩",
|
||||
"pe": "秘鲁",
|
||||
"peoplesdemocraticrepublicofalgeria": "阿尔及利亚",
|
||||
"peoplesrepublicofbangladesh": "孟加拉国",
|
||||
"peoplesrepublicofchina": "中国",
|
||||
"per": "秘鲁",
|
||||
"peru": "秘鲁",
|
||||
"pf": "法属波利尼西亚",
|
||||
"pg": "巴布亚新几内亚",
|
||||
"ph": "菲律宾",
|
||||
"philippines": "菲律宾",
|
||||
"philippinesthe": "菲律宾",
|
||||
"phl": "菲律宾",
|
||||
"pitcairn": "皮特凯恩",
|
||||
"pk": "巴基斯坦",
|
||||
"pl": "波兰",
|
||||
"plw": "帕劳",
|
||||
"pm": "圣皮埃尔和密克隆",
|
||||
"pn": "皮特凯恩",
|
||||
"png": "巴布亚新几内亚",
|
||||
"pol": "波兰",
|
||||
"poland": "波兰",
|
||||
"portugal": "葡萄牙",
|
||||
"portugueserepublic": "葡萄牙",
|
||||
"pr": "波多黎各",
|
||||
"pri": "波多黎各",
|
||||
"principalityofandorra": "安道尔",
|
||||
"principalityofliechtenstein": "列支敦士登",
|
||||
"principalityofmonaco": "摩纳哥",
|
||||
"prk": "朝鲜",
|
||||
"prt": "葡萄牙",
|
||||
"pry": "巴拉圭",
|
||||
"ps": "巴勒斯坦",
|
||||
"pse": "巴勒斯坦",
|
||||
"pt": "葡萄牙",
|
||||
"puertorico": "波多黎各",
|
||||
"pw": "帕劳",
|
||||
"py": "巴拉圭",
|
||||
"pyf": "法属波利尼西亚",
|
||||
"qa": "卡塔尔",
|
||||
"qat": "卡塔尔",
|
||||
"qatar": "卡塔尔",
|
||||
"re": "留尼汪",
|
||||
"republicofalbania": "阿尔巴尼亚",
|
||||
"republicofangola": "安哥拉",
|
||||
"republicofarmenia": "亚美尼亚",
|
||||
"republicofaustria": "奥地利",
|
||||
"republicofazerbaijan": "阿塞拜疆",
|
||||
"republicofbelarus": "白俄罗斯",
|
||||
"republicofbenin": "贝宁",
|
||||
"republicofbolivia": "玻利维亚",
|
||||
"republicofbotswana": "博茨瓦纳",
|
||||
"republicofbulgaria": "保加利亚",
|
||||
"republicofburundi": "布隆迪",
|
||||
"republicofcameroon": "喀麦隆",
|
||||
"republicofcapeverde": "佛得角",
|
||||
"republicofchad": "乍得",
|
||||
"republicofchile": "智利",
|
||||
"republicofcolombia": "哥伦比亚",
|
||||
"republicofcongo": "刚果(布)",
|
||||
"republicofcostarica": "哥斯达黎加",
|
||||
"republicofcroatia": "克罗地亚",
|
||||
"republicofctedivoire": "科特迪瓦",
|
||||
"republicofcuba": "古巴",
|
||||
"republicofcyprus": "塞浦路斯",
|
||||
"republicofdjibouti": "吉布提",
|
||||
"republicofecuador": "厄瓜多尔",
|
||||
"republicofelsalvador": "萨尔瓦多",
|
||||
"republicofequatorialguinea": "赤道几内亚",
|
||||
"republicofestonia": "爱沙尼亚",
|
||||
"republicoffijiislands": "斐济",
|
||||
"republicoffinland": "芬兰",
|
||||
"republicofgambia": "冈比亚",
|
||||
"republicofghana": "加纳",
|
||||
"republicofguatemala": "危地马拉",
|
||||
"republicofguinea": "几内亚",
|
||||
"republicofguineabissau": "几内亚比绍",
|
||||
"republicofguyana": "圭亚那",
|
||||
"republicofhaiti": "海地",
|
||||
"republicofhonduras": "洪都拉斯",
|
||||
"republicofhungary": "匈牙利",
|
||||
"republicoficeland": "冰岛",
|
||||
"republicofindia": "印度",
|
||||
"republicofindonesia": "印度尼西亚",
|
||||
"republicofiraq": "伊拉克",
|
||||
"republicofitaly": "意大利",
|
||||
"republicofkazakhstan": "哈萨克斯坦",
|
||||
"republicofkenya": "肯尼亚",
|
||||
"republicofkiribati": "基里巴斯",
|
||||
"republicofkorea": "韩国",
|
||||
"republicoflatvia": "拉脱维亚",
|
||||
"republicofliberia": "利比里亚",
|
||||
"republicoflithuania": "立陶宛",
|
||||
"republicofmadagascar": "马达加斯加",
|
||||
"republicofmalawi": "马拉维",
|
||||
"republicofmaldives": "马尔代夫",
|
||||
"republicofmali": "马里",
|
||||
"republicofmalta": "马耳他",
|
||||
"republicofmarshallislands": "马绍尔群岛",
|
||||
"republicofmauritius": "毛里求斯",
|
||||
"republicofmoldova": "摩尔多瓦",
|
||||
"republicofmozambique": "莫桑比克",
|
||||
"republicofnamibia": "纳米比亚",
|
||||
"republicofnauru": "瑙鲁",
|
||||
"republicofnicaragua": "尼加拉瓜",
|
||||
"republicofniger": "尼日尔",
|
||||
"republicofniue": "纽埃",
|
||||
"republicofpalau": "帕劳",
|
||||
"republicofpanama": "巴拿马",
|
||||
"republicofparaguay": "巴拉圭",
|
||||
"republicofperu": "秘鲁",
|
||||
"republicofphilippines": "菲律宾",
|
||||
"republicofpoland": "波兰",
|
||||
"republicofrwanda": "卢旺达",
|
||||
"republicofsanmarino": "圣马力诺",
|
||||
"republicofsenegal": "塞内加尔",
|
||||
"republicofserbia": "塞尔维亚",
|
||||
"republicofseychelles": "塞舌尔",
|
||||
"republicofsierraleone": "塞拉利昂",
|
||||
"republicofsingapore": "新加坡",
|
||||
"republicofslovenia": "斯洛文尼亚",
|
||||
"republicofsouthafrica": "南非",
|
||||
"republicofsudan": "苏丹",
|
||||
"republicofsuriname": "苏里南",
|
||||
"republicoftajikistan": "塔吉克斯坦",
|
||||
"republicoftrinidadandtobago": "特立尼达和多巴哥",
|
||||
"republicoftunisia": "突尼斯",
|
||||
"republicofturkey": "土耳其",
|
||||
"republicofuganda": "乌干达",
|
||||
"republicofuzbekistan": "乌兹别克斯坦",
|
||||
"republicofvanuatu": "瓦努阿图",
|
||||
"republicofyemen": "也门",
|
||||
"republicofzambia": "赞比亚",
|
||||
"republicofzimbabwe": "津巴布韦",
|
||||
"reu": "留尼汪",
|
||||
"ro": "罗马尼亚",
|
||||
"romania": "罗马尼亚",
|
||||
"rou": "罗马尼亚",
|
||||
"rs": "塞尔维亚",
|
||||
"ru": "俄罗斯联邦",
|
||||
"runion": "留尼汪",
|
||||
"rus": "俄罗斯联邦",
|
||||
"russianfederation": "俄罗斯联邦",
|
||||
"russianfederationthe": "俄罗斯联邦",
|
||||
"rw": "卢旺达",
|
||||
"rwa": "卢旺达",
|
||||
"rwanda": "卢旺达",
|
||||
"sa": "沙特阿拉伯",
|
||||
"sainlena": "圣赫勒拿",
|
||||
"sainthelena": "圣赫勒拿",
|
||||
"saintkittsandnevis": "圣基茨和尼维斯",
|
||||
"saintlucia": "圣卢西亚",
|
||||
"saintpierreandmiquelon": "圣皮埃尔和密克隆",
|
||||
"saintvincentandgrenadines": "圣文森特和格林纳丁斯",
|
||||
"saintvincentandthegrenadines": "圣文森特和格林纳丁斯",
|
||||
"samoa": "萨摩亚",
|
||||
"sanmarino": "圣马力诺",
|
||||
"saotomeandprincipe": "圣多美和普林西比",
|
||||
"sau": "沙特阿拉伯",
|
||||
"saudiarabia": "沙特阿拉伯",
|
||||
"sb": "所罗门群岛",
|
||||
"sc": "塞舌尔",
|
||||
"sd": "苏丹",
|
||||
"sdn": "苏丹",
|
||||
"se": "瑞典",
|
||||
"sen": "塞内加尔",
|
||||
"senegal": "塞内加尔",
|
||||
"serbia": "塞尔维亚",
|
||||
"seychelles": "塞舌尔",
|
||||
"sg": "新加坡",
|
||||
"sgp": "新加坡",
|
||||
"sgs": "南乔治亚岛和南桑德韦奇岛",
|
||||
"sh": "圣赫勒拿",
|
||||
"shn": "圣赫勒拿",
|
||||
"si": "斯洛文尼亚",
|
||||
"sierraleone": "塞拉利昂",
|
||||
"singapore": "新加坡",
|
||||
"sj": "斯瓦尔巴岛和扬马延岛",
|
||||
"sjm": "斯瓦尔巴岛和扬马延岛",
|
||||
"sk": "斯洛伐克",
|
||||
"sl": "塞拉利昂",
|
||||
"slb": "所罗门群岛",
|
||||
"sle": "塞拉利昂",
|
||||
"slovakia": "斯洛伐克",
|
||||
"slovakrepublic": "斯洛伐克",
|
||||
"slovenia": "斯洛文尼亚",
|
||||
"slv": "萨尔瓦多",
|
||||
"sm": "圣马力诺",
|
||||
"smr": "圣马力诺",
|
||||
"sn": "塞内加尔",
|
||||
"so": "索马里",
|
||||
"socialistpeopleslibyanarabjamahiriya": "利比亚",
|
||||
"socialistrepublicofvietnam": "越南",
|
||||
"solomonislands": "所罗门群岛",
|
||||
"solomonislandsthe": "所罗门群岛",
|
||||
"som": "索马里",
|
||||
"somalia": "索马里",
|
||||
"somalirepublic": "索马里",
|
||||
"southafrica": "南非",
|
||||
"southgeorgiaandsouthsandwichislands": "南乔治亚岛和南桑德韦奇岛",
|
||||
"southgeorgiaandthesouthsandwichislands": "南乔治亚岛和南桑德韦奇岛",
|
||||
"spain": "西班牙",
|
||||
"spm": "圣皮埃尔和密克隆",
|
||||
"sr": "苏里南",
|
||||
"srb": "塞尔维亚",
|
||||
"srilanka": "斯里兰卡",
|
||||
"st": "圣多美和普林西比",
|
||||
"stateofisrael": "以色列",
|
||||
"stateofqatar": "卡塔尔",
|
||||
"stp": "圣多美和普林西比",
|
||||
"sudan": "苏丹",
|
||||
"sudanthe": "苏丹",
|
||||
"sultanateofoman": "阿曼",
|
||||
"sur": "苏里南",
|
||||
"suriname": "苏里南",
|
||||
"sv": "萨尔瓦多",
|
||||
"svalbardandjanmayen": "斯瓦尔巴岛和扬马延岛",
|
||||
"svk": "斯洛伐克",
|
||||
"svn": "斯洛文尼亚",
|
||||
"swaziland": "斯威士兰",
|
||||
"swe": "瑞典",
|
||||
"sweden": "瑞典",
|
||||
"swissconfederation": "瑞士",
|
||||
"switzerland": "瑞士",
|
||||
"swz": "斯威士兰",
|
||||
"sy": "叙利亚",
|
||||
"syc": "塞舌尔",
|
||||
"syr": "叙利亚",
|
||||
"syrianarabrepublic": "叙利亚",
|
||||
"syrianarabrepublicthe": "叙利亚",
|
||||
"sz": "斯威士兰",
|
||||
"tajikistan": "塔吉克斯坦",
|
||||
"tanzaniaunitedrepublicof": "坦桑尼亚",
|
||||
"tc": "特克斯和凯科斯群岛",
|
||||
"tca": "特克斯和凯科斯群岛",
|
||||
"tcd": "乍得",
|
||||
"td": "乍得",
|
||||
"tf": "法属南部领地",
|
||||
"tg": "多哥",
|
||||
"tgo": "多哥",
|
||||
"th": "泰国",
|
||||
"tha": "泰国",
|
||||
"thailand": "泰国",
|
||||
"thearabrepublicofegypt": "埃及",
|
||||
"theargentinerepublic": "阿根廷",
|
||||
"thebolivarianrepublicofvenezuela": "委内瑞拉",
|
||||
"thecentralafricanrepublic": "中非",
|
||||
"thecommonwealthofdominica": "多米尼克",
|
||||
"thecommonwealthofthebahamas": "巴哈马",
|
||||
"thecommonwealthofthenorthernmarianaislands": "北马里亚纳",
|
||||
"theczechrepublic": "捷克",
|
||||
"thedemocraticpeoplesrepublicofkorea": "朝鲜",
|
||||
"thedemocraticrepublicofsaotomeandprincipe": "圣多美和普林西比",
|
||||
"thedemocraticrepublicofthecongo": "刚果(金)",
|
||||
"thedemocraticrepublicoftimorleste": "东帝汶",
|
||||
"thedemocraticsocialistrepublicofsrilanka": "斯里兰卡",
|
||||
"thedominicanrepublic": "多米尼加",
|
||||
"theeasternrepublicofuruguay": "乌拉圭",
|
||||
"thefederaldemocraticrepublicofethiopia": "埃塞俄比亚",
|
||||
"thefederalrepublicofnigeria": "尼日利亚",
|
||||
"thefederatedstatesofmicronesia": "密克罗尼西亚联邦",
|
||||
"thefederativerepublicofbrazil": "巴西",
|
||||
"theformeryugoslavrepublicofmacedonia": "前南马其顿",
|
||||
"thefrenchrepublic": "法国",
|
||||
"thegaboneserepublic": "加蓬",
|
||||
"thegrandduchyofluxembourg": "卢森堡",
|
||||
"thehashemitekingdomofjordan": "约旦",
|
||||
"thehellenicrepublic": "希腊",
|
||||
"theindependentstateofsamoa": "萨摩亚",
|
||||
"theislamicrepublicofafghanistan": "阿富汗",
|
||||
"theislamicrepublicofiran": "伊朗",
|
||||
"theislamicrepublicofmauritania": "毛利塔尼亚",
|
||||
"theislamicrepublicofpakistan": "巴基斯坦",
|
||||
"thekingdomofbahrain": "巴林",
|
||||
"thekingdomofbelgium": "比利时",
|
||||
"thekingdomofbhutan": "不丹",
|
||||
"thekingdomofcambodia": "柬埔寨",
|
||||
"thekingdomofdenmark": "丹麦",
|
||||
"thekingdomoflesotho": "莱索托",
|
||||
"thekingdomofmorocco": "摩洛哥",
|
||||
"thekingdomofnorway": "挪威",
|
||||
"thekingdomofsaudiarabia": "沙特阿拉伯",
|
||||
"thekingdomofspain": "西班牙",
|
||||
"thekingdomofswaziland": "斯威士兰",
|
||||
"thekingdomofsweden": "瑞典",
|
||||
"thekingdomofthailand": "泰国",
|
||||
"thekingdomofthenetherlands": "荷兰",
|
||||
"thekingdomoftonga": "汤加",
|
||||
"thekyrgyzrepublic": "吉尔吉斯斯坦",
|
||||
"thelaopeoplesdemocraticrepublic": "老挝",
|
||||
"thelebaneserepublic": "黎巴嫩",
|
||||
"theoccupiedpalestinianterritory": "巴勒斯坦",
|
||||
"thepeoplesdemocraticrepublicofalgeria": "阿尔及利亚",
|
||||
"thepeoplesrepublicofbangladesh": "孟加拉国",
|
||||
"thepeoplesrepublicofchina": "中国",
|
||||
"theportugueserepublic": "葡萄牙",
|
||||
"theprincipalityofandorra": "安道尔",
|
||||
"theprincipalityofliechtenstein": "列支敦士登",
|
||||
"theprincipalityofmonaco": "摩纳哥",
|
||||
"therepublicofalbania": "阿尔巴尼亚",
|
||||
"therepublicofangola": "安哥拉",
|
||||
"therepublicofarmenia": "亚美尼亚",
|
||||
"therepublicofaustria": "奥地利",
|
||||
"therepublicofazerbaijan": "阿塞拜疆",
|
||||
"therepublicofbelarus": "白俄罗斯",
|
||||
"therepublicofbenin": "贝宁",
|
||||
"therepublicofbolivia": "玻利维亚",
|
||||
"therepublicofbotswana": "博茨瓦纳",
|
||||
"therepublicofbulgaria": "保加利亚",
|
||||
"therepublicofburundi": "布隆迪",
|
||||
"therepublicofcameroon": "喀麦隆",
|
||||
"therepublicofcapeverde": "佛得角",
|
||||
"therepublicofchad": "乍得",
|
||||
"therepublicofchile": "智利",
|
||||
"therepublicofcolombia": "哥伦比亚",
|
||||
"therepublicofcostarica": "哥斯达黎加",
|
||||
"therepublicofcroatia": "克罗地亚",
|
||||
"therepublicofctedivoire": "科特迪瓦",
|
||||
"therepublicofcuba": "古巴",
|
||||
"therepublicofcyprus": "塞浦路斯",
|
||||
"therepublicofdjibouti": "吉布提",
|
||||
"therepublicofecuador": "厄瓜多尔",
|
||||
"therepublicofelsalvador": "萨尔瓦多",
|
||||
"therepublicofequatorialguinea": "赤道几内亚",
|
||||
"therepublicofestonia": "爱沙尼亚",
|
||||
"therepublicoffinland": "芬兰",
|
||||
"therepublicofghana": "加纳",
|
||||
"therepublicofguatemala": "危地马拉",
|
||||
"therepublicofguinea": "几内亚",
|
||||
"therepublicofguineabissau": "几内亚比绍",
|
||||
"therepublicofguyana": "圭亚那",
|
||||
"therepublicofhaiti": "海地",
|
||||
"therepublicofhonduras": "洪都拉斯",
|
||||
"therepublicofhungary": "匈牙利",
|
||||
"therepublicoficeland": "冰岛",
|
||||
"therepublicofindia": "印度",
|
||||
"therepublicofindonesia": "印度尼西亚",
|
||||
"therepublicofiraq": "伊拉克",
|
||||
"therepublicofitaly": "意大利",
|
||||
"therepublicofkazakhstan": "哈萨克斯坦",
|
||||
"therepublicofkenya": "肯尼亚",
|
||||
"therepublicofkiribati": "基里巴斯",
|
||||
"therepublicofkorea": "韩国",
|
||||
"therepublicoflatvia": "拉脱维亚",
|
||||
"therepublicofliberia": "利比里亚",
|
||||
"therepublicoflithuania": "立陶宛",
|
||||
"therepublicofmadagascar": "马达加斯加",
|
||||
"therepublicofmalawi": "马拉维",
|
||||
"therepublicofmaldives": "马尔代夫",
|
||||
"therepublicofmali": "马里",
|
||||
"therepublicofmalta": "马耳他",
|
||||
"therepublicofmauritius": "毛里求斯",
|
||||
"therepublicofmoldova": "摩尔多瓦",
|
||||
"therepublicofmozambique": "莫桑比克",
|
||||
"therepublicofnamibia": "纳米比亚",
|
||||
"therepublicofnauru": "瑙鲁",
|
||||
"therepublicofnicaragua": "尼加拉瓜",
|
||||
"therepublicofniue": "纽埃",
|
||||
"therepublicofpalau": "帕劳",
|
||||
"therepublicofpanama": "巴拿马",
|
||||
"therepublicofparaguay": "巴拉圭",
|
||||
"therepublicofperu": "秘鲁",
|
||||
"therepublicofpoland": "波兰",
|
||||
"therepublicofrwanda": "卢旺达",
|
||||
"therepublicofsanmarino": "圣马力诺",
|
||||
"therepublicofsenegal": "塞内加尔",
|
||||
"therepublicofserbia": "塞尔维亚",
|
||||
"therepublicofseychelles": "塞舌尔",
|
||||
"therepublicofsierraleone": "塞拉利昂",
|
||||
"therepublicofsingapore": "新加坡",
|
||||
"therepublicofslovenia": "斯洛文尼亚",
|
||||
"therepublicofsouthafrica": "南非",
|
||||
"therepublicofsuriname": "苏里南",
|
||||
"therepublicoftajikistan": "塔吉克斯坦",
|
||||
"therepublicofthecongo": "刚果(布)",
|
||||
"therepublicofthefijiislands": "斐济",
|
||||
"therepublicofthegambia": "冈比亚",
|
||||
"therepublicofthemarshallislands": "马绍尔群岛",
|
||||
"therepublicoftheniger": "尼日尔",
|
||||
"therepublicofthephilippines": "菲律宾",
|
||||
"therepublicofthesudan": "苏丹",
|
||||
"therepublicoftrinidadandtobago": "特立尼达和多巴哥",
|
||||
"therepublicoftunisia": "突尼斯",
|
||||
"therepublicofturkey": "土耳其",
|
||||
"therepublicofuganda": "乌干达",
|
||||
"therepublicofuzbekistan": "乌兹别克斯坦",
|
||||
"therepublicofvanuatu": "瓦努阿图",
|
||||
"therepublicofyemen": "也门",
|
||||
"therepublicofzambia": "赞比亚",
|
||||
"therepublicofzimbabwe": "津巴布韦",
|
||||
"therussianfederation": "俄罗斯联邦",
|
||||
"theslovakrepublic": "斯洛伐克",
|
||||
"thesocialistpeopleslibyanarabjamahiriya": "利比亚",
|
||||
"thesocialistrepublicofvietnam": "越南",
|
||||
"thesomalirepublic": "索马里",
|
||||
"thestateofisrael": "以色列",
|
||||
"thestateofqatar": "卡塔尔",
|
||||
"thesultanateofoman": "阿曼",
|
||||
"theswissconfederation": "瑞士",
|
||||
"thesyrianarabrepublic": "叙利亚",
|
||||
"thetogoleserepublic": "多哥",
|
||||
"theunionofmyanmar": "缅甸",
|
||||
"theunionofthecomoros": "科摩罗",
|
||||
"theunitedarabemirates": "阿联酋",
|
||||
"theunitedkingdomofgreatbritainandnorthernireland": "英国",
|
||||
"theunitedmexicanstates": "墨西哥",
|
||||
"theunitedrepublicoftanzania": "坦桑尼亚",
|
||||
"theunitedstatesofamerica": "美国",
|
||||
"thevirginislandsoftheunitedstates": "美属维尔京群岛",
|
||||
"timorleste": "东帝汶",
|
||||
"tj": "塔吉克斯坦",
|
||||
"tjk": "塔吉克斯坦",
|
||||
"tk": "托克劳",
|
||||
"tkl": "托克劳",
|
||||
"tkm": "土库曼斯坦",
|
||||
"tl": "东帝汶",
|
||||
"tls": "东帝汶",
|
||||
"tm": "土库曼斯坦",
|
||||
"tn": "突尼斯",
|
||||
"to": "汤加",
|
||||
"togo": "多哥",
|
||||
"togoleserepublic": "多哥",
|
||||
"tokelau": "托克劳",
|
||||
"ton": "汤加",
|
||||
"tonga": "汤加",
|
||||
"tr": "土耳其",
|
||||
"trinidadandtobago": "特立尼达和多巴哥",
|
||||
"tt": "特立尼达和多巴哥",
|
||||
"tto": "特立尼达和多巴哥",
|
||||
"tun": "突尼斯",
|
||||
"tunisia": "突尼斯",
|
||||
"tur": "土耳其",
|
||||
"turkey": "土耳其",
|
||||
"turkmenistan": "土库曼斯坦",
|
||||
"turksandcaicosislands": "特克斯和凯科斯群岛",
|
||||
"turksandcaicosislandsthe": "特克斯和凯科斯群岛",
|
||||
"tuv": "图瓦卢",
|
||||
"tuvalu": "图瓦卢",
|
||||
"tv": "图瓦卢",
|
||||
"tz": "坦桑尼亚",
|
||||
"tza": "坦桑尼亚",
|
||||
"ua": "乌克兰",
|
||||
"ug": "乌干达",
|
||||
"uga": "乌干达",
|
||||
"uganda": "乌干达",
|
||||
"ukr": "乌克兰",
|
||||
"ukraine": "乌克兰",
|
||||
"um": "美国本土外小岛屿",
|
||||
"umi": "美国本土外小岛屿",
|
||||
"unionofcomoros": "科摩罗",
|
||||
"unionofmyanmar": "缅甸",
|
||||
"unitedarabemirates": "阿联酋",
|
||||
"unitedarabemiratesthe": "阿联酋",
|
||||
"unitedkingdom": "英国",
|
||||
"unitedkingdomofgreatbritainandnorrnireland": "英国",
|
||||
"unitedkingdomthe": "英国",
|
||||
"unitedmexicanstates": "墨西哥",
|
||||
"unitedrepublicoftanzania": "坦桑尼亚",
|
||||
"unitedstates": "美国",
|
||||
"unitedstatesminoroutlyingislands": "美国本土外小岛屿",
|
||||
"unitedstatesminoroutlyingislandsthe": "美国本土外小岛屿",
|
||||
"unitedstatesofamerica": "美国",
|
||||
"unitedstatesthe": "美国",
|
||||
"uruguay": "乌拉圭",
|
||||
"ury": "乌拉圭",
|
||||
"us": "美国",
|
||||
"usa": "美国",
|
||||
"uy": "乌拉圭",
|
||||
"uz": "乌兹别克斯坦",
|
||||
"uzb": "乌兹别克斯坦",
|
||||
"uzbekistan": "乌兹别克斯坦",
|
||||
"va": "梵蒂冈",
|
||||
"vanuatu": "瓦努阿图",
|
||||
"vat": "梵蒂冈",
|
||||
"vc": "圣文森特和格林纳丁斯",
|
||||
"vct": "圣文森特和格林纳丁斯",
|
||||
"ve": "委内瑞拉",
|
||||
"ven": "委内瑞拉",
|
||||
"venezuela": "委内瑞拉",
|
||||
"vg": "英属维尔京群岛",
|
||||
"vgb": "英属维尔京群岛",
|
||||
"vi": "美属维尔京群岛",
|
||||
"vietnam": "越南",
|
||||
"vir": "美属维尔京群岛",
|
||||
"virginislandsbritish": "英属维尔京群岛",
|
||||
"virginislandsofunitedstates": "美属维尔京群岛",
|
||||
"virginislandsus": "美属维尔京群岛",
|
||||
"vn": "越南",
|
||||
"vnm": "越南",
|
||||
"vu": "瓦努阿图",
|
||||
"vut": "瓦努阿图",
|
||||
"wallisandfutuna": "瓦利斯和富图纳",
|
||||
"wallisandfutunaislands": "瓦利斯和富图纳",
|
||||
"westernsahara": "西撒哈拉",
|
||||
"wf": "瓦利斯和富图纳",
|
||||
"wlf": "瓦利斯和富图纳",
|
||||
"ws": "萨摩亚",
|
||||
"wsm": "萨摩亚",
|
||||
"ye": "也门",
|
||||
"yem": "也门",
|
||||
"yemen": "也门",
|
||||
"yt": "马约特",
|
||||
"za": "南非",
|
||||
"zaf": "南非",
|
||||
"zambia": "赞比亚",
|
||||
"zhongguo": "中国",
|
||||
"zimbabwe": "津巴布韦",
|
||||
"zm": "赞比亚",
|
||||
"zmb": "赞比亚",
|
||||
"zw": "津巴布韦",
|
||||
"zwe": "津巴布韦"
|
||||
},
|
||||
"provinceNameByKey": {
|
||||
"anhui": "安徽",
|
||||
"anhuisheng": "安徽",
|
||||
"aomen": "澳门",
|
||||
"aomentebiexingzhengqu": "澳门",
|
||||
"beijing": "北京",
|
||||
"beijingshi": "北京",
|
||||
"chongqing": "重庆",
|
||||
"chongqingshi": "重庆",
|
||||
"fujian": "福建",
|
||||
"fujiansheng": "福建",
|
||||
"gansu": "甘肃",
|
||||
"gansusheng": "甘肃",
|
||||
"guangdong": "广东",
|
||||
"guangdongsheng": "广东",
|
||||
"guangxi": "广西",
|
||||
"guangxizhuangzu": "广西",
|
||||
"guangxizhuangzuzizhiqu": "广西",
|
||||
"guizhou": "贵州",
|
||||
"guizhousheng": "贵州",
|
||||
"hainan": "海南",
|
||||
"hainansheng": "海南",
|
||||
"hebei": "河北",
|
||||
"hebeisheng": "河北",
|
||||
"heilongjiang": "黑龙江",
|
||||
"heilongjiangsheng": "黑龙江",
|
||||
"henan": "河南",
|
||||
"henansheng": "河南",
|
||||
"hubei": "湖北",
|
||||
"hubeisheng": "湖北",
|
||||
"hunan": "湖南",
|
||||
"hunansheng": "湖南",
|
||||
"jiangsu": "江苏",
|
||||
"jiangsusheng": "江苏",
|
||||
"jiangxi": "江西",
|
||||
"jiangxisheng": "江西",
|
||||
"jilin": "吉林",
|
||||
"jilinsheng": "吉林",
|
||||
"liaoning": "辽宁",
|
||||
"liaoningsheng": "辽宁",
|
||||
"neimenggu": "内蒙古",
|
||||
"neimengguzizhiqu": "内蒙古",
|
||||
"ningxia": "宁夏",
|
||||
"ningxiahuizu": "宁夏",
|
||||
"ningxiahuizuzizhiqu": "宁夏",
|
||||
"qinghai": "青海",
|
||||
"qinghaisheng": "青海",
|
||||
"shandong": "山东",
|
||||
"shandongsheng": "山东",
|
||||
"shanghai": "上海",
|
||||
"shanghaishi": "上海",
|
||||
"shanxi": "陕西",
|
||||
"shanxisheng": "陕西",
|
||||
"sichuan": "四川",
|
||||
"sichuansheng": "四川",
|
||||
"taiwan": "台湾",
|
||||
"taiwansheng": "台湾",
|
||||
"tianjin": "天津",
|
||||
"tianjinshi": "天津",
|
||||
"xianggang": "香港",
|
||||
"xianggangtebiexingzhengqu": "香港",
|
||||
"xinjiang": "新疆",
|
||||
"xinjiangweiwuer": "新疆",
|
||||
"xinjiangweiwuerzizhiqu": "新疆",
|
||||
"xizang": "西藏",
|
||||
"xizangzizhiqu": "西藏",
|
||||
"yunnan": "云南",
|
||||
"yunnansheng": "云南",
|
||||
"zhejiang": "浙江",
|
||||
"zhejiangsheng": "浙江"
|
||||
},
|
||||
"provinceKeyByName": {
|
||||
"上海": "shanghai",
|
||||
"上海市": "shanghai",
|
||||
"云南": "yunnan",
|
||||
"云南省": "yunnan",
|
||||
"内蒙古": "neimenggu",
|
||||
"内蒙古自治区": "neimenggu",
|
||||
"北京": "beijing",
|
||||
"北京市": "beijing",
|
||||
"台湾": "taiwan",
|
||||
"台湾省": "taiwan",
|
||||
"吉林": "jilin",
|
||||
"吉林省": "jilin",
|
||||
"四川": "sichuan",
|
||||
"四川省": "sichuan",
|
||||
"天津": "tianjin",
|
||||
"天津市": "tianjin",
|
||||
"宁夏": "ningxia",
|
||||
"宁夏回族自治区": "ningxia",
|
||||
"安徽": "anhui",
|
||||
"安徽省": "anhui",
|
||||
"山东": "shandong",
|
||||
"山东省": "shandong",
|
||||
"山西": "shanxi",
|
||||
"山西省": "shanxi",
|
||||
"广东": "guangdong",
|
||||
"广东省": "guangdong",
|
||||
"广西": "guangxi",
|
||||
"广西壮族自治区": "guangxi",
|
||||
"新疆": "xinjiang",
|
||||
"新疆维吾尔自治区": "xinjiang",
|
||||
"江苏": "jiangsu",
|
||||
"江苏省": "jiangsu",
|
||||
"江西": "jiangxi",
|
||||
"江西省": "jiangxi",
|
||||
"河北": "hebei",
|
||||
"河北省": "hebei",
|
||||
"河南": "henan",
|
||||
"河南省": "henan",
|
||||
"浙江": "zhejiang",
|
||||
"浙江省": "zhejiang",
|
||||
"海南": "hainan",
|
||||
"海南省": "hainan",
|
||||
"湖北": "hubei",
|
||||
"湖北省": "hubei",
|
||||
"湖南": "hunan",
|
||||
"湖南省": "hunan",
|
||||
"澳门": "aomen",
|
||||
"澳门特别行政区": "aomen",
|
||||
"甘肃": "gansu",
|
||||
"甘肃省": "gansu",
|
||||
"福建": "fujian",
|
||||
"福建省": "fujian",
|
||||
"西藏": "xizang",
|
||||
"西藏自治区": "xizang",
|
||||
"贵州": "guizhou",
|
||||
"贵州省": "guizhou",
|
||||
"辽宁": "liaoning",
|
||||
"辽宁省": "liaoning",
|
||||
"重庆": "chongqing",
|
||||
"重庆市": "chongqing",
|
||||
"陕西": "shanxi",
|
||||
"陕西省": "shanxi",
|
||||
"青海": "qinghai",
|
||||
"青海省": "qinghai",
|
||||
"香港": "xianggang",
|
||||
"香港特别行政区": "xianggang",
|
||||
"黑龙江": "heilongjiang",
|
||||
"黑龙江省": "heilongjiang"
|
||||
},
|
||||
"cityNameByProvinceKey": {
|
||||
"anhui": {
|
||||
"anhuianqingjingjikaifaqu": "安徽安庆经济开发区",
|
||||
"anhuiwuhusanshanjingjikaifaqu": "安徽芜湖三山经济开发区",
|
||||
"anqing": "安庆",
|
||||
"anqingshi": "安庆",
|
||||
"bagongshanqu": "八公山区",
|
||||
"bangshanqu": "蚌山区",
|
||||
"baohequ": "包河区",
|
||||
"bengbu": "蚌埠",
|
||||
"bengbushi": "蚌埠",
|
||||
"bengbushigaoxinjishukaifaqu": "蚌埠市高新技术开发区",
|
||||
"bengbushijingjikaifaqu": "蚌埠市经济开发区",
|
||||
"bowangqu": "博望区",
|
||||
"bozhou": "亳州",
|
||||
"bozhoushi": "亳州",
|
||||
"chaohu": "巢湖市",
|
||||
"chaohushi": "巢湖市",
|
||||
"chizhou": "池州",
|
||||
"chizhoushi": "池州",
|
||||
"chuzhou": "滁州",
|
||||
"chuzhoujingjijishukaifaqu": "滁州经济技术开发区",
|
||||
"chuzhoushi": "滁州",
|
||||
"daguanqu": "大观区",
|
||||
"dangshanxian": "砀山县",
|
||||
"dangtuxian": "当涂县",
|
||||
"datongqu": "大通区",
|
||||
"dingyuanxian": "定远县",
|
||||
"dongzhixian": "东至县",
|
||||
"dujiqu": "杜集区",
|
||||
"fanchangqu": "繁昌区",
|
||||
"feidongxian": "肥东县",
|
||||
"feixixian": "肥西县",
|
||||
"fengtaixian": "凤台县",
|
||||
"fengyangxian": "凤阳县",
|
||||
"funanxian": "阜南县",
|
||||
"fuyang": "阜阳",
|
||||
"fuyanghefeixiandaichanyeyuanqu": "阜阳合肥现代产业园区",
|
||||
"fuyangjingjijishukaifaqu": "阜阳经济技术开发区",
|
||||
"fuyangshi": "阜阳",
|
||||
"guangde": "广德市",
|
||||
"guangdeshi": "广德市",
|
||||
"guichiqu": "贵池区",
|
||||
"guzhenxian": "固镇县",
|
||||
"hanshanxian": "含山县",
|
||||
"hefei": "合肥",
|
||||
"hefeigaoxinjishuchanyekaifaqu": "合肥高新技术产业开发区",
|
||||
"hefeijingjijishukaifaqu": "合肥经济技术开发区",
|
||||
"hefeishi": "合肥",
|
||||
"hefeixinzhangaoxinjishuchanyekaifaqu": "合肥新站高新技术产业开发区",
|
||||
"hexian": "和县",
|
||||
"huaibei": "淮北",
|
||||
"huaibeishi": "淮北",
|
||||
"huainan": "淮南",
|
||||
"huainanshi": "淮南",
|
||||
"huainingxian": "怀宁县",
|
||||
"huaishangqu": "淮上区",
|
||||
"huaiyuanxian": "怀远县",
|
||||
"huangshan": "黄山",
|
||||
"huangshanqu": "黄山区",
|
||||
"huangshanshi": "黄山",
|
||||
"huashanqu": "花山区",
|
||||
"huizhouqu": "徽州区",
|
||||
"huoqiuxian": "霍邱县",
|
||||
"huoshanxian": "霍山县",
|
||||
"jiaoqu": "郊区",
|
||||
"jieshou": "界首市",
|
||||
"jieshoushi": "界首市",
|
||||
"jinanqu": "金安区",
|
||||
"jingdexian": "旌德县",
|
||||
"jinghuqu": "镜湖区",
|
||||
"jingxian": "泾县",
|
||||
"jinzhaixian": "金寨县",
|
||||
"jiujiangqu": "鸠江区",
|
||||
"jixixian": "绩溪县",
|
||||
"laianxian": "来安县",
|
||||
"langxixian": "郎溪县",
|
||||
"langyaqu": "琅琊区",
|
||||
"lieshanqu": "烈山区",
|
||||
"lingbixian": "灵璧县",
|
||||
"linquanxian": "临泉县",
|
||||
"lixinxian": "利辛县",
|
||||
"longzihuqu": "龙子湖区",
|
||||
"luan": "六安",
|
||||
"luanshi": "六安",
|
||||
"lujiangxian": "庐江县",
|
||||
"luyangqu": "庐阳区",
|
||||
"maanshan": "马鞍山",
|
||||
"maanshanshi": "马鞍山",
|
||||
"mengchengxian": "蒙城县",
|
||||
"mingguang": "明光市",
|
||||
"mingguangshi": "明光市",
|
||||
"nanlingxian": "南陵县",
|
||||
"nanqiaoqu": "南谯区",
|
||||
"ningguo": "宁国市",
|
||||
"ningguoshi": "宁国市",
|
||||
"panjiqu": "潘集区",
|
||||
"qianshan": "潜山市",
|
||||
"qianshanshi": "潜山市",
|
||||
"qiaochengqu": "谯城区",
|
||||
"qimenxian": "祁门县",
|
||||
"qingyangxian": "青阳县",
|
||||
"quanjiaoxian": "全椒县",
|
||||
"shexian": "歙县",
|
||||
"shitaixian": "石台县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shouxian": "寿县",
|
||||
"shuchengxian": "舒城县",
|
||||
"shushanqu": "蜀山区",
|
||||
"sixian": "泗县",
|
||||
"suixixian": "濉溪县",
|
||||
"susongxian": "宿松县",
|
||||
"suzhou": "宿州",
|
||||
"suzhoujingjijishukaifaqu": "宿州经济技术开发区",
|
||||
"suzhoumaanshanxiandaichanyeyuanqu": "宿州马鞍山现代产业园区",
|
||||
"suzhoushi": "宿州",
|
||||
"taihexian": "太和县",
|
||||
"taihuxian": "太湖县",
|
||||
"tianjiaanqu": "田家庵区",
|
||||
"tianzhang": "天长市",
|
||||
"tianzhangshi": "天长市",
|
||||
"tongcheng": "桐城市",
|
||||
"tongchengshi": "桐城市",
|
||||
"tongguanqu": "铜官区",
|
||||
"tongling": "铜陵",
|
||||
"tonglingshi": "铜陵",
|
||||
"tunxiqu": "屯溪区",
|
||||
"wangjiangxian": "望江县",
|
||||
"wanzhiqu": "湾沚区",
|
||||
"woyangxian": "涡阳县",
|
||||
"wuhexian": "五河县",
|
||||
"wuhu": "芜湖",
|
||||
"wuhujingjijishukaifaqu": "芜湖经济技术开发区",
|
||||
"wuhushi": "芜湖",
|
||||
"wuwei": "无为市",
|
||||
"wuweishi": "无为市",
|
||||
"xiangshanqu": "相山区",
|
||||
"xiaoxian": "萧县",
|
||||
"xiejiajiqu": "谢家集区",
|
||||
"xiuningxian": "休宁县",
|
||||
"xuancheng": "宣城",
|
||||
"xuanchengshi": "宣城",
|
||||
"xuanchengshijingjikaifaqu": "宣城市经济开发区",
|
||||
"xuanzhouqu": "宣州区",
|
||||
"yaohaiqu": "瑶海区",
|
||||
"yejiqu": "叶集区",
|
||||
"yianqu": "义安区",
|
||||
"yijiangqu": "弋江区",
|
||||
"yingdongqu": "颍东区",
|
||||
"yingjiangqu": "迎江区",
|
||||
"yingquanqu": "颍泉区",
|
||||
"yingshangxian": "颍上县",
|
||||
"yingzhouqu": "颍州区",
|
||||
"yixian": "黟县",
|
||||
"yixiuqu": "宜秀区",
|
||||
"yongqiaoqu": "埇桥区",
|
||||
"yuanqu": "裕安区",
|
||||
"yuexixian": "岳西县",
|
||||
"yuhuiqu": "禹会区",
|
||||
"yushanqu": "雨山区",
|
||||
"zhangfengxian": "长丰县",
|
||||
"zhongxinsuchugaoxinjishuchanyekaifaqu": "中新苏滁高新技术产业开发区",
|
||||
"zongyangxian": "枞阳县"
|
||||
},
|
||||
"aomen": {
|
||||
"datangqu": "大堂区",
|
||||
"fengshuntangqu": "风顺堂区",
|
||||
"huadimatangqu": "花地玛堂区",
|
||||
"huawangtangqu": "花王堂区",
|
||||
"jiamotangqu": "嘉模堂区",
|
||||
"ludangtianhaiqu": "路凼填海区",
|
||||
"shengfangjigetangqu": "圣方济各堂区",
|
||||
"wangdetangqu": "望德堂区"
|
||||
},
|
||||
"beijing": {
|
||||
"changpingqu": "昌平区",
|
||||
"chaoyangqu": "朝阳区",
|
||||
"daxingqu": "大兴区",
|
||||
"dongchengqu": "东城区",
|
||||
"fangshanqu": "房山区",
|
||||
"fengtaiqu": "丰台区",
|
||||
"haidianqu": "海淀区",
|
||||
"huairouqu": "怀柔区",
|
||||
"mentougouqu": "门头沟区",
|
||||
"miyunqu": "密云区",
|
||||
"pingguqu": "平谷区",
|
||||
"shijingshanqu": "石景山区",
|
||||
"shunyiqu": "顺义区",
|
||||
"tongzhouqu": "通州区",
|
||||
"xichengqu": "西城区",
|
||||
"yanqingqu": "延庆区"
|
||||
},
|
||||
"chongqing": {
|
||||
"bananqu": "巴南区",
|
||||
"beibeiqu": "北碚区",
|
||||
"bishanqu": "璧山区",
|
||||
"changshouqu": "长寿区",
|
||||
"chengkouxian": "城口县",
|
||||
"dadukouqu": "大渡口区",
|
||||
"dazuqu": "大足区",
|
||||
"dianjiangxian": "垫江县",
|
||||
"fengdouxian": "丰都县",
|
||||
"fengjiexian": "奉节县",
|
||||
"fulingqu": "涪陵区",
|
||||
"hechuanqu": "合川区",
|
||||
"jiangbeiqu": "江北区",
|
||||
"jiangjinqu": "江津区",
|
||||
"jiulongpoqu": "九龙坡区",
|
||||
"kaizhouqu": "开州区",
|
||||
"liangpingqu": "梁平区",
|
||||
"nananqu": "南岸区",
|
||||
"nanchuanqu": "南川区",
|
||||
"pengshuimiaozutujiazuzizhixian": "彭水苗族土家族自治县",
|
||||
"qianjiangqu": "黔江区",
|
||||
"qijiangqu": "綦江区",
|
||||
"rongchangqu": "荣昌区",
|
||||
"shapingbaqu": "沙坪坝区",
|
||||
"shizhutujiazuzizhixian": "石柱土家族自治县",
|
||||
"tongliangqu": "铜梁区",
|
||||
"tongnanqu": "潼南区",
|
||||
"wanzhouqu": "万州区",
|
||||
"wulongqu": "武隆区",
|
||||
"wushanxian": "巫山县",
|
||||
"wuxixian": "巫溪县",
|
||||
"xiushantujiazumiaozuzizhixian": "秀山土家族苗族自治县",
|
||||
"yongchuanqu": "永川区",
|
||||
"youyangtujiazumiaozuzizhixian": "酉阳土家族苗族自治县",
|
||||
"yubeiqu": "渝北区",
|
||||
"yunyangxian": "云阳县",
|
||||
"yuzhongqu": "渝中区",
|
||||
"zhongxian": "忠县"
|
||||
},
|
||||
"fujian": {
|
||||
"anxixian": "安溪县",
|
||||
"cangshanqu": "仓山区",
|
||||
"changlequ": "长乐区",
|
||||
"changtingxian": "长汀县",
|
||||
"chengxiangqu": "城厢区",
|
||||
"datianxian": "大田县",
|
||||
"dehuaxian": "德化县",
|
||||
"dongshanxian": "东山县",
|
||||
"fengzequ": "丰泽区",
|
||||
"fuan": "福安市",
|
||||
"fuanshi": "福安市",
|
||||
"fuding": "福鼎市",
|
||||
"fudingshi": "福鼎市",
|
||||
"fuqing": "福清市",
|
||||
"fuqingshi": "福清市",
|
||||
"fuzhou": "福州",
|
||||
"fuzhoushi": "福州",
|
||||
"guangzexian": "光泽县",
|
||||
"gulouqu": "鼓楼区",
|
||||
"gutianxian": "古田县",
|
||||
"haicangqu": "海沧区",
|
||||
"hanjiangqu": "涵江区",
|
||||
"huaanxian": "华安县",
|
||||
"huianxian": "惠安县",
|
||||
"huliqu": "湖里区",
|
||||
"jianglexian": "将乐县",
|
||||
"jianningxian": "建宁县",
|
||||
"jianou": "建瓯市",
|
||||
"jianoushi": "建瓯市",
|
||||
"jianyangqu": "建阳区",
|
||||
"jiaochengqu": "蕉城区",
|
||||
"jimeiqu": "集美区",
|
||||
"jinanqu": "晋安区",
|
||||
"jinjiang": "晋江市",
|
||||
"jinjiangshi": "晋江市",
|
||||
"jinmenxian": "金门县",
|
||||
"lianchengxian": "连城县",
|
||||
"lianjiangxian": "连江县",
|
||||
"lichengqu": "荔城区",
|
||||
"longhai": "龙海市",
|
||||
"longhaiqu": "龙海区",
|
||||
"longhaishi": "龙海市",
|
||||
"longwenqu": "龙文区",
|
||||
"longyan": "龙岩",
|
||||
"longyanshi": "龙岩",
|
||||
"luojiangqu": "洛江区",
|
||||
"luoyuanxian": "罗源县",
|
||||
"mayiqu": "马尾区",
|
||||
"meiliequ": "梅列区",
|
||||
"mingxixian": "明溪县",
|
||||
"minhouxian": "闽侯县",
|
||||
"minqingxian": "闽清县",
|
||||
"nanan": "南安市",
|
||||
"nananshi": "南安市",
|
||||
"nanjingxian": "南靖县",
|
||||
"nanping": "南平",
|
||||
"nanpingshi": "南平",
|
||||
"ningde": "宁德",
|
||||
"ningdeshi": "宁德",
|
||||
"ninghuaxian": "宁化县",
|
||||
"pinghexian": "平和县",
|
||||
"pingnanxian": "屏南县",
|
||||
"pingtanxian": "平潭县",
|
||||
"puchengxian": "浦城县",
|
||||
"putian": "莆田",
|
||||
"putianshi": "莆田",
|
||||
"qingliuxian": "清流县",
|
||||
"quangangqu": "泉港区",
|
||||
"quanzhou": "泉州",
|
||||
"quanzhoushi": "泉州",
|
||||
"sanming": "三明",
|
||||
"sanmingshi": "三明",
|
||||
"sanyuanqu": "三元区",
|
||||
"shanghangxian": "上杭县",
|
||||
"shaowu": "邵武市",
|
||||
"shaowushi": "邵武市",
|
||||
"shaxian": "沙县",
|
||||
"shaxianqu": "沙县区",
|
||||
"shishi": "石狮市",
|
||||
"shishishi": "石狮市",
|
||||
"shixiaqu": "市辖区",
|
||||
"shouningxian": "寿宁县",
|
||||
"shunchangxian": "顺昌县",
|
||||
"simingqu": "思明区",
|
||||
"songxixian": "松溪县",
|
||||
"taijiangqu": "台江区",
|
||||
"tainingxian": "泰宁县",
|
||||
"tonganqu": "同安区",
|
||||
"wupingxian": "武平县",
|
||||
"wuyishan": "武夷山市",
|
||||
"wuyishanshi": "武夷山市",
|
||||
"xiamen": "厦门",
|
||||
"xiamenshi": "厦门",
|
||||
"xianganqu": "翔安区",
|
||||
"xiangchengqu": "芗城区",
|
||||
"xianyouxian": "仙游县",
|
||||
"xiapuxian": "霞浦县",
|
||||
"xinluoqu": "新罗区",
|
||||
"xiuyuqu": "秀屿区",
|
||||
"yanpingqu": "延平区",
|
||||
"yongan": "永安市",
|
||||
"yonganshi": "永安市",
|
||||
"yongchunxian": "永春县",
|
||||
"yongdingqu": "永定区",
|
||||
"yongtaixian": "永泰县",
|
||||
"youxixian": "尤溪县",
|
||||
"yunxiaoxian": "云霄县",
|
||||
"zhangping": "漳平市",
|
||||
"zhangpingshi": "漳平市",
|
||||
"zhangpuxian": "漳浦县",
|
||||
"zhangtaiqu": "长泰区",
|
||||
"zhangtaixian": "长泰县",
|
||||
"zhangzhou": "漳州",
|
||||
"zhangzhoushi": "漳州",
|
||||
"zhaoanxian": "诏安县",
|
||||
"zhenghexian": "政和县",
|
||||
"zherongxian": "柘荣县",
|
||||
"zhouningxian": "周宁县"
|
||||
},
|
||||
"gansu": {
|
||||
"akesaihasakezuzizhixian": "阿克塞哈萨克族自治县",
|
||||
"andingqu": "安定区",
|
||||
"anningqu": "安宁区",
|
||||
"baiyin": "白银",
|
||||
"baiyinqu": "白银区",
|
||||
"baiyinshi": "白银",
|
||||
"chengguanqu": "城关区",
|
||||
"chengxian": "成县",
|
||||
"chongxinxian": "崇信县",
|
||||
"dangchangxian": "宕昌县",
|
||||
"diebuxian": "迭部县",
|
||||
"dingxi": "定西",
|
||||
"dingxishi": "定西",
|
||||
"dongxiangzuzizhixian": "东乡族自治县",
|
||||
"dunhuang": "敦煌市",
|
||||
"dunhuangshi": "敦煌市",
|
||||
"ganguxian": "甘谷县",
|
||||
"gannanzangzu": "甘南藏族",
|
||||
"gannanzangzuzizhizhou": "甘南藏族",
|
||||
"ganzhouqu": "甘州区",
|
||||
"gaolanxian": "皋兰县",
|
||||
"gaotaixian": "高台县",
|
||||
"guanghexian": "广河县",
|
||||
"guazhouxian": "瓜州县",
|
||||
"gulangxian": "古浪县",
|
||||
"heshuixian": "合水县",
|
||||
"hezhengxian": "和政县",
|
||||
"hezuo": "合作市",
|
||||
"hezuoshi": "合作市",
|
||||
"hongguqu": "红古区",
|
||||
"huachixian": "华池县",
|
||||
"huanxian": "环县",
|
||||
"huating": "华亭市",
|
||||
"huatingshi": "华亭市",
|
||||
"huiningxian": "会宁县",
|
||||
"huixian": "徽县",
|
||||
"jiayuguan": "嘉峪关",
|
||||
"jiayuguanshi": "嘉峪关",
|
||||
"jinchang": "金昌",
|
||||
"jinchangshi": "金昌",
|
||||
"jinchuanqu": "金川区",
|
||||
"jingchuanxian": "泾川县",
|
||||
"jingningxian": "静宁县",
|
||||
"jingtaixian": "景泰县",
|
||||
"jingyuanxian": "靖远县",
|
||||
"jintaxian": "金塔县",
|
||||
"jishishanbaoanzudongxiangzusalazuzizhixian": "积石山保安族东乡族撒拉族自治县",
|
||||
"jiuquan": "酒泉",
|
||||
"jiuquanshi": "酒泉",
|
||||
"kanglexian": "康乐县",
|
||||
"kangxian": "康县",
|
||||
"kongdongqu": "崆峒区",
|
||||
"lanzhou": "兰州",
|
||||
"lanzhoushi": "兰州",
|
||||
"lanzhouxinqu": "兰州新区",
|
||||
"liangdangxian": "两当县",
|
||||
"liangzhouqu": "凉州区",
|
||||
"lingtaixian": "灵台县",
|
||||
"lintanxian": "临潭县",
|
||||
"lintaoxian": "临洮县",
|
||||
"linxia": "临夏市",
|
||||
"linxiahuizu": "临夏回族",
|
||||
"linxiahuizuzizhizhou": "临夏回族",
|
||||
"linxiashi": "临夏市",
|
||||
"linxiaxian": "临夏县",
|
||||
"linzexian": "临泽县",
|
||||
"lixian": "礼县",
|
||||
"longnan": "陇南",
|
||||
"longnanshi": "陇南",
|
||||
"longxixian": "陇西县",
|
||||
"luquxian": "碌曲县",
|
||||
"maijiqu": "麦积区",
|
||||
"maquxian": "玛曲县",
|
||||
"minqinxian": "民勤县",
|
||||
"minxian": "岷县",
|
||||
"minyuexian": "民乐县",
|
||||
"ningxian": "宁县",
|
||||
"pingchuanqu": "平川区",
|
||||
"pingliang": "平凉",
|
||||
"pingliangshi": "平凉",
|
||||
"qilihequ": "七里河区",
|
||||
"qinanxian": "秦安县",
|
||||
"qingchengxian": "庆城县",
|
||||
"qingshuixian": "清水县",
|
||||
"qingyang": "庆阳",
|
||||
"qingyangshi": "庆阳",
|
||||
"qinzhouqu": "秦州区",
|
||||
"shandanxian": "山丹县",
|
||||
"shixiaqu": "市辖区",
|
||||
"subeimengguzuzizhixian": "肃北蒙古族自治县",
|
||||
"sunanyuguzuzizhixian": "肃南裕固族自治县",
|
||||
"suzhouqu": "肃州区",
|
||||
"tianshui": "天水",
|
||||
"tianshuishi": "天水",
|
||||
"tianzhuzangzuzizhixian": "天祝藏族自治县",
|
||||
"tongweixian": "通渭县",
|
||||
"weiyuanxian": "渭源县",
|
||||
"wenxian": "文县",
|
||||
"wudouqu": "武都区",
|
||||
"wushanxian": "武山县",
|
||||
"wuwei": "武威",
|
||||
"wuweishi": "武威",
|
||||
"xiahexian": "夏河县",
|
||||
"xifengqu": "西峰区",
|
||||
"xiguqu": "西固区",
|
||||
"xihexian": "西和县",
|
||||
"yongchangxian": "永昌县",
|
||||
"yongdengxian": "永登县",
|
||||
"yongjingxian": "永靖县",
|
||||
"yumen": "玉门市",
|
||||
"yumenshi": "玉门市",
|
||||
"yuzhongxian": "榆中县",
|
||||
"zhangjiachuanhuizuzizhixian": "张家川回族自治县",
|
||||
"zhangxian": "漳县",
|
||||
"zhangye": "张掖",
|
||||
"zhangyeshi": "张掖",
|
||||
"zhengningxian": "正宁县",
|
||||
"zhenyuanxian": "镇原县",
|
||||
"zhouquxian": "舟曲县",
|
||||
"zhuanglangxian": "庄浪县",
|
||||
"zhuonixian": "卓尼县"
|
||||
},
|
||||
"guangdong": {
|
||||
"baiyunqu": "白云区",
|
||||
"baoanqu": "宝安区",
|
||||
"boluoxian": "博罗县",
|
||||
"chanchengqu": "禅城区",
|
||||
"chaoanqu": "潮安区",
|
||||
"chaonanqu": "潮南区",
|
||||
"chaoyangqu": "潮阳区",
|
||||
"chaozhou": "潮州",
|
||||
"chaozhoushi": "潮州",
|
||||
"chenghaiqu": "澄海区",
|
||||
"chengqu": "城区",
|
||||
"chikanqu": "赤坎区",
|
||||
"conghuaqu": "从化区",
|
||||
"dabuxian": "大埔县",
|
||||
"deqingxian": "德庆县",
|
||||
"dianbaiqu": "电白区",
|
||||
"dinghuqu": "鼎湖区",
|
||||
"dongguan": "东莞",
|
||||
"dongguanshi": "东莞",
|
||||
"dongyuanxian": "东源县",
|
||||
"doumenqu": "斗门区",
|
||||
"duanzhouqu": "端州区",
|
||||
"enping": "恩平市",
|
||||
"enpingshi": "恩平市",
|
||||
"fengkaixian": "封开县",
|
||||
"fengshunxian": "丰顺县",
|
||||
"foshan": "佛山",
|
||||
"foshanshi": "佛山",
|
||||
"fugangxian": "佛冈县",
|
||||
"futianqu": "福田区",
|
||||
"gaomingqu": "高明区",
|
||||
"gaoyaoqu": "高要区",
|
||||
"gaozhou": "高州市",
|
||||
"gaozhoushi": "高州市",
|
||||
"guangmingqu": "光明区",
|
||||
"guangningxian": "广宁县",
|
||||
"guangzhou": "广州",
|
||||
"guangzhoushi": "广州",
|
||||
"haifengxian": "海丰县",
|
||||
"haizhuqu": "海珠区",
|
||||
"haojiangqu": "濠江区",
|
||||
"hepingxian": "和平县",
|
||||
"heshan": "鹤山市",
|
||||
"heshanshi": "鹤山市",
|
||||
"heyuan": "河源",
|
||||
"heyuanshi": "河源",
|
||||
"huadouqu": "花都区",
|
||||
"huaijixian": "怀集县",
|
||||
"huangpuqu": "黄埔区",
|
||||
"huazhou": "化州市",
|
||||
"huazhoushi": "化州市",
|
||||
"huichengqu": "惠城区",
|
||||
"huidongxian": "惠东县",
|
||||
"huilaixian": "惠来县",
|
||||
"huiyangqu": "惠阳区",
|
||||
"huizhou": "惠州",
|
||||
"huizhoushi": "惠州",
|
||||
"jiangchengqu": "江城区",
|
||||
"jianghaiqu": "江海区",
|
||||
"jiangmen": "江门",
|
||||
"jiangmenshi": "江门",
|
||||
"jiaolingxian": "蕉岭县",
|
||||
"jiedongqu": "揭东区",
|
||||
"jiexixian": "揭西县",
|
||||
"jieyang": "揭阳",
|
||||
"jieyangshi": "揭阳",
|
||||
"jinpingqu": "金平区",
|
||||
"jinwanqu": "金湾区",
|
||||
"kaiping": "开平市",
|
||||
"kaipingshi": "开平市",
|
||||
"lechang": "乐昌市",
|
||||
"lechangshi": "乐昌市",
|
||||
"leizhou": "雷州市",
|
||||
"leizhoushi": "雷州市",
|
||||
"lianjiang": "廉江市",
|
||||
"lianjiangshi": "廉江市",
|
||||
"liannanyaozuzizhixian": "连南瑶族自治县",
|
||||
"lianpingxian": "连平县",
|
||||
"lianshanzhuangzuyaozuzizhixian": "连山壮族瑶族自治县",
|
||||
"lianzhou": "连州市",
|
||||
"lianzhoushi": "连州市",
|
||||
"liwanqu": "荔湾区",
|
||||
"longchuanxian": "龙川县",
|
||||
"longgangqu": "龙岗区",
|
||||
"longhuaqu": "龙华区",
|
||||
"longhuqu": "龙湖区",
|
||||
"longmenxian": "龙门县",
|
||||
"lufeng": "陆丰市",
|
||||
"lufengshi": "陆丰市",
|
||||
"luhexian": "陆河县",
|
||||
"luoding": "罗定市",
|
||||
"luodingshi": "罗定市",
|
||||
"luohuqu": "罗湖区",
|
||||
"maoming": "茂名",
|
||||
"maomingshi": "茂名",
|
||||
"maonanqu": "茂南区",
|
||||
"mazhangqu": "麻章区",
|
||||
"meijiangqu": "梅江区",
|
||||
"meixianqu": "梅县区",
|
||||
"meizhou": "梅州",
|
||||
"meizhoushi": "梅州",
|
||||
"nanaoxian": "南澳县",
|
||||
"nanhaiqu": "南海区",
|
||||
"nanshanqu": "南山区",
|
||||
"nanshaqu": "南沙区",
|
||||
"nanxiong": "南雄市",
|
||||
"nanxiongshi": "南雄市",
|
||||
"panyuqu": "番禺区",
|
||||
"pengjiangqu": "蓬江区",
|
||||
"pingshanqu": "坪山区",
|
||||
"pingyuanxian": "平远县",
|
||||
"potouqu": "坡头区",
|
||||
"puning": "普宁市",
|
||||
"puningshi": "普宁市",
|
||||
"qingchengqu": "清城区",
|
||||
"qingxinqu": "清新区",
|
||||
"qingyuan": "清远",
|
||||
"qingyuanshi": "清远",
|
||||
"qujiangqu": "曲江区",
|
||||
"raopingxian": "饶平县",
|
||||
"renhuaxian": "仁化县",
|
||||
"rongchengqu": "榕城区",
|
||||
"ruyuanyaozuzizhixian": "乳源瑶族自治县",
|
||||
"sanshuiqu": "三水区",
|
||||
"shantou": "汕头",
|
||||
"shantoushi": "汕头",
|
||||
"shanwei": "汕尾",
|
||||
"shanweishi": "汕尾",
|
||||
"shaoguan": "韶关",
|
||||
"shaoguanshi": "韶关",
|
||||
"shenzhen": "深圳",
|
||||
"shenzhenshi": "深圳",
|
||||
"shixiaqu": "市辖区",
|
||||
"shixingxian": "始兴县",
|
||||
"shundequ": "顺德区",
|
||||
"sihui": "四会市",
|
||||
"sihuishi": "四会市",
|
||||
"suixixian": "遂溪县",
|
||||
"taishan": "台山市",
|
||||
"taishanshi": "台山市",
|
||||
"tianhequ": "天河区",
|
||||
"wengyuanxian": "翁源县",
|
||||
"wuchuan": "吴川市",
|
||||
"wuchuanshi": "吴川市",
|
||||
"wuhuaxian": "五华县",
|
||||
"wujiangqu": "武江区",
|
||||
"xiangqiaoqu": "湘桥区",
|
||||
"xiangzhouqu": "香洲区",
|
||||
"xiashanqu": "霞山区",
|
||||
"xinfengxian": "新丰县",
|
||||
"xingning": "兴宁市",
|
||||
"xingningshi": "兴宁市",
|
||||
"xinhuiqu": "新会区",
|
||||
"xinxingxian": "新兴县",
|
||||
"xinyi": "信宜市",
|
||||
"xinyishi": "信宜市",
|
||||
"xuwenxian": "徐闻县",
|
||||
"yangchun": "阳春市",
|
||||
"yangchunshi": "阳春市",
|
||||
"yangdongqu": "阳东区",
|
||||
"yangjiang": "阳江",
|
||||
"yangjiangshi": "阳江",
|
||||
"yangshanxian": "阳山县",
|
||||
"yangxixian": "阳西县",
|
||||
"yantianqu": "盐田区",
|
||||
"yingde": "英德市",
|
||||
"yingdeshi": "英德市",
|
||||
"yuanchengqu": "源城区",
|
||||
"yuexiuqu": "越秀区",
|
||||
"yunanqu": "云安区",
|
||||
"yunanxian": "郁南县",
|
||||
"yunchengqu": "云城区",
|
||||
"yunfu": "云浮",
|
||||
"yunfushi": "云浮",
|
||||
"zengchengqu": "增城区",
|
||||
"zhanjiang": "湛江",
|
||||
"zhanjiangshi": "湛江",
|
||||
"zhaoqing": "肇庆",
|
||||
"zhaoqingshi": "肇庆",
|
||||
"zhenjiangqu": "浈江区",
|
||||
"zhongshan": "中山",
|
||||
"zhongshanshi": "中山",
|
||||
"zhuhai": "珠海",
|
||||
"zhuhaishi": "珠海",
|
||||
"zijinxian": "紫金县"
|
||||
},
|
||||
"guangxi": {
|
||||
"babuqu": "八步区",
|
||||
"baise": "百色",
|
||||
"baiseshi": "百色",
|
||||
"bamayaozuzizhixian": "巴马瑶族自治县",
|
||||
"beihai": "北海",
|
||||
"beihaishi": "北海",
|
||||
"beiliu": "北流市",
|
||||
"beiliushi": "北流市",
|
||||
"binyangxian": "宾阳县",
|
||||
"bobaixian": "博白县",
|
||||
"cangwuxian": "苍梧县",
|
||||
"cenxi": "岑溪市",
|
||||
"cenxishi": "岑溪市",
|
||||
"chengzhongqu": "城中区",
|
||||
"chongzuo": "崇左",
|
||||
"chongzuoshi": "崇左",
|
||||
"dahuayaozuzizhixian": "大化瑶族自治县",
|
||||
"daxinxian": "大新县",
|
||||
"debaoxian": "德保县",
|
||||
"diecaiqu": "叠彩区",
|
||||
"donglanxian": "东兰县",
|
||||
"dongxing": "东兴市",
|
||||
"dongxingshi": "东兴市",
|
||||
"douanyaozuzizhixian": "都安瑶族自治县",
|
||||
"fangchenggang": "防城港",
|
||||
"fangchenggangshi": "防城港",
|
||||
"fangchengqu": "防城区",
|
||||
"fengshanxian": "凤山县",
|
||||
"fuchuanyaozuzizhixian": "富川瑶族自治县",
|
||||
"fumianqu": "福绵区",
|
||||
"fusuixian": "扶绥县",
|
||||
"gangbeiqu": "港北区",
|
||||
"gangkouqu": "港口区",
|
||||
"gangnanqu": "港南区",
|
||||
"gongchengyaozuzizhixian": "恭城瑶族自治县",
|
||||
"guanyangxian": "灌阳县",
|
||||
"guigang": "贵港",
|
||||
"guigangshi": "贵港",
|
||||
"guilin": "桂林",
|
||||
"guilinshi": "桂林",
|
||||
"guiping": "桂平市",
|
||||
"guipingshi": "桂平市",
|
||||
"haichengqu": "海城区",
|
||||
"hechi": "河池",
|
||||
"hechishi": "河池",
|
||||
"hengxian": "横县",
|
||||
"hengzhou": "横州市",
|
||||
"hengzhoushi": "横州市",
|
||||
"hepuxian": "合浦县",
|
||||
"heshan": "合山市",
|
||||
"heshanshi": "合山市",
|
||||
"hezhou": "贺州",
|
||||
"hezhoushi": "贺州",
|
||||
"huanjiangmaonanzuzizhixian": "环江毛南族自治县",
|
||||
"jiangnanqu": "江南区",
|
||||
"jiangzhouqu": "江州区",
|
||||
"jinchengjiangqu": "金城江区",
|
||||
"jingxi": "靖西市",
|
||||
"jingxishi": "靖西市",
|
||||
"jinxiuyaozuzizhixian": "金秀瑶族自治县",
|
||||
"laibin": "来宾",
|
||||
"laibinshi": "来宾",
|
||||
"leyexian": "乐业县",
|
||||
"liangqingqu": "良庆区",
|
||||
"lingchuanxian": "灵川县",
|
||||
"lingshanxian": "灵山县",
|
||||
"linguiqu": "临桂区",
|
||||
"lingyunxian": "凌云县",
|
||||
"lipu": "荔浦市",
|
||||
"lipushi": "荔浦市",
|
||||
"liubeiqu": "柳北区",
|
||||
"liuchengxian": "柳城县",
|
||||
"liujiangqu": "柳江区",
|
||||
"liunanqu": "柳南区",
|
||||
"liuzhou": "柳州",
|
||||
"liuzhoushi": "柳州",
|
||||
"longanxian": "隆安县",
|
||||
"longlingezuzizhixian": "隆林各族自治县",
|
||||
"longshenggezuzizhixian": "龙胜各族自治县",
|
||||
"longweiqu": "龙圩区",
|
||||
"longzhouxian": "龙州县",
|
||||
"luchuanxian": "陆川县",
|
||||
"luochengmulaozuzizhixian": "罗城仫佬族自治县",
|
||||
"luzhaixian": "鹿寨县",
|
||||
"mashanxian": "马山县",
|
||||
"mengshanxian": "蒙山县",
|
||||
"nandanxian": "南丹县",
|
||||
"nanning": "南宁",
|
||||
"nanningshi": "南宁",
|
||||
"napoxian": "那坡县",
|
||||
"ningmingxian": "宁明县",
|
||||
"pingguiqu": "平桂区",
|
||||
"pingguo": "平果市",
|
||||
"pingguoshi": "平果市",
|
||||
"pinglexian": "平乐县",
|
||||
"pingnanxian": "平南县",
|
||||
"pingxiang": "凭祥市",
|
||||
"pingxiangshi": "凭祥市",
|
||||
"pubeixian": "浦北县",
|
||||
"qinbeiqu": "钦北区",
|
||||
"qingxiuqu": "青秀区",
|
||||
"qinnanqu": "钦南区",
|
||||
"qinzhou": "钦州",
|
||||
"qinzhoushi": "钦州",
|
||||
"qixingqu": "七星区",
|
||||
"quanzhouxian": "全州县",
|
||||
"ronganxian": "融安县",
|
||||
"rongshuimiaozuzizhixian": "融水苗族自治县",
|
||||
"rongxian": "容县",
|
||||
"sanjiangdongzuzizhixian": "三江侗族自治县",
|
||||
"shanglinxian": "上林县",
|
||||
"shangsixian": "上思县",
|
||||
"shixiaqu": "市辖区",
|
||||
"tantangqu": "覃塘区",
|
||||
"tengxian": "藤县",
|
||||
"tiandengxian": "天等县",
|
||||
"tiandongxian": "田东县",
|
||||
"tianexian": "天峨县",
|
||||
"tianlinxian": "田林县",
|
||||
"tianyangqu": "田阳区",
|
||||
"tieshangangqu": "铁山港区",
|
||||
"wanxiuqu": "万秀区",
|
||||
"wumingqu": "武鸣区",
|
||||
"wuxuanxian": "武宣县",
|
||||
"wuzhou": "梧州",
|
||||
"wuzhoushi": "梧州",
|
||||
"xiangshanqu": "象山区",
|
||||
"xiangzhouxian": "象州县",
|
||||
"xilinxian": "西林县",
|
||||
"xinchengxian": "忻城县",
|
||||
"xinganxian": "兴安县",
|
||||
"xingbinqu": "兴宾区",
|
||||
"xingningqu": "兴宁区",
|
||||
"xingyexian": "兴业县",
|
||||
"xiufengqu": "秀峰区",
|
||||
"xixiangtangqu": "西乡塘区",
|
||||
"yangshuoxian": "阳朔县",
|
||||
"yanshanqu": "雁山区",
|
||||
"yinhaiqu": "银海区",
|
||||
"yizhouqu": "宜州区",
|
||||
"yongfuxian": "永福县",
|
||||
"yongningqu": "邕宁区",
|
||||
"youjiangqu": "右江区",
|
||||
"yufengqu": "鱼峰区",
|
||||
"yulin": "玉林",
|
||||
"yulinshi": "玉林",
|
||||
"yuzhouqu": "玉州区",
|
||||
"zhangzhouqu": "长洲区",
|
||||
"zhaopingxian": "昭平县",
|
||||
"zhongshanxian": "钟山县",
|
||||
"ziyuanxian": "资源县"
|
||||
},
|
||||
"guizhou": {
|
||||
"anlongxian": "安龙县",
|
||||
"anshun": "安顺",
|
||||
"anshunshi": "安顺",
|
||||
"baiyunqu": "白云区",
|
||||
"bijiangqu": "碧江区",
|
||||
"bijie": "毕节",
|
||||
"bijieshi": "毕节",
|
||||
"bozhouqu": "播州区",
|
||||
"cehengxian": "册亨县",
|
||||
"cengongxian": "岑巩县",
|
||||
"chishui": "赤水市",
|
||||
"chishuishi": "赤水市",
|
||||
"congjiangxian": "从江县",
|
||||
"dafangxian": "大方县",
|
||||
"danzhaixian": "丹寨县",
|
||||
"daozhengelaozumiaozuzizhixian": "道真仡佬族苗族自治县",
|
||||
"dejiangxian": "德江县",
|
||||
"douyun": "都匀市",
|
||||
"douyunshi": "都匀市",
|
||||
"dushanxian": "独山县",
|
||||
"fenggangxian": "凤冈县",
|
||||
"fuquan": "福泉市",
|
||||
"fuquanshi": "福泉市",
|
||||
"guanlingbuyizumiaozuzizhixian": "关岭布依族苗族自治县",
|
||||
"guanshanhuqu": "观山湖区",
|
||||
"guidingxian": "贵定县",
|
||||
"guiyang": "贵阳",
|
||||
"guiyangshi": "贵阳",
|
||||
"hezhangxian": "赫章县",
|
||||
"honghuagangqu": "红花岗区",
|
||||
"huangpingxian": "黄平县",
|
||||
"huaxiqu": "花溪区",
|
||||
"huichuanqu": "汇川区",
|
||||
"huishuixian": "惠水县",
|
||||
"jiangkouxian": "江口县",
|
||||
"jianhexian": "剑河县",
|
||||
"jinpingxian": "锦屏县",
|
||||
"jinshaxian": "金沙县",
|
||||
"kaili": "凯里市",
|
||||
"kailishi": "凯里市",
|
||||
"kaiyangxian": "开阳县",
|
||||
"leishanxian": "雷山县",
|
||||
"liboxian": "荔波县",
|
||||
"lipingxian": "黎平县",
|
||||
"liupanshui": "六盘水",
|
||||
"liupanshuishi": "六盘水",
|
||||
"liuzhitequ": "六枝特区",
|
||||
"longlixian": "龙里县",
|
||||
"luodianxian": "罗甸县",
|
||||
"majiangxian": "麻江县",
|
||||
"meitanxian": "湄潭县",
|
||||
"nanmingqu": "南明区",
|
||||
"nayongxian": "纳雍县",
|
||||
"panzhou": "盘州市",
|
||||
"panzhoushi": "盘州市",
|
||||
"pingbaqu": "平坝区",
|
||||
"pingtangxian": "平塘县",
|
||||
"puanxian": "普安县",
|
||||
"pudingxian": "普定县",
|
||||
"qiandongnanmiaozudongzu": "黔东南苗族侗族",
|
||||
"qiandongnanmiaozudongzuzizhizhou": "黔东南苗族侗族",
|
||||
"qiannanbuyizumiaozu": "黔南布依族苗族",
|
||||
"qiannanbuyizumiaozuzizhizhou": "黔南布依族苗族",
|
||||
"qianxi": "黔西市",
|
||||
"qianxinanbuyizumiaozu": "黔西南布依族苗族",
|
||||
"qianxinanbuyizumiaozuzizhizhou": "黔西南布依族苗族",
|
||||
"qianxishi": "黔西市",
|
||||
"qianxixian": "黔西县",
|
||||
"qinglongxian": "晴隆县",
|
||||
"qingzhen": "清镇市",
|
||||
"qingzhenshi": "清镇市",
|
||||
"qixingguanqu": "七星关区",
|
||||
"renhuai": "仁怀市",
|
||||
"renhuaishi": "仁怀市",
|
||||
"rongjiangxian": "榕江县",
|
||||
"sandoushuizuzizhixian": "三都水族自治县",
|
||||
"sansuixian": "三穗县",
|
||||
"shibingxian": "施秉县",
|
||||
"shiqianxian": "石阡县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shuichengqu": "水城区",
|
||||
"sinanxian": "思南县",
|
||||
"songtaomiaozuzizhixian": "松桃苗族自治县",
|
||||
"suiyangxian": "绥阳县",
|
||||
"taijiangxian": "台江县",
|
||||
"tianzhuxian": "天柱县",
|
||||
"tongren": "铜仁",
|
||||
"tongrenshi": "铜仁",
|
||||
"tongzixian": "桐梓县",
|
||||
"wangmoxian": "望谟县",
|
||||
"wanshanqu": "万山区",
|
||||
"weiningyizuhuizumiaozuzizhixian": "威宁彝族回族苗族自治县",
|
||||
"wenganxian": "瓮安县",
|
||||
"wuchuangelaozumiaozuzizhixian": "务川仡佬族苗族自治县",
|
||||
"wudangqu": "乌当区",
|
||||
"xifengxian": "息烽县",
|
||||
"xingren": "兴仁市",
|
||||
"xingrenshi": "兴仁市",
|
||||
"xingyi": "兴义市",
|
||||
"xingyishi": "兴义市",
|
||||
"xishuixian": "习水县",
|
||||
"xiuwenxian": "修文县",
|
||||
"xixiuqu": "西秀区",
|
||||
"yanhetujiazuzizhixian": "沿河土家族自治县",
|
||||
"yinjiangtujiazumiaozuzizhixian": "印江土家族苗族自治县",
|
||||
"yunyanqu": "云岩区",
|
||||
"yupingdongzuzizhixian": "玉屏侗族自治县",
|
||||
"yuqingxian": "余庆县",
|
||||
"zhangshunxian": "长顺县",
|
||||
"zhenfengxian": "贞丰县",
|
||||
"zhenganxian": "正安县",
|
||||
"zhenningbuyizumiaozuzizhixian": "镇宁布依族苗族自治县",
|
||||
"zhenyuanxian": "镇远县",
|
||||
"zhijinxian": "织金县",
|
||||
"zhongshanqu": "钟山区",
|
||||
"ziyunmiaozubuyizuzizhixian": "紫云苗族布依族自治县",
|
||||
"zunyi": "遵义",
|
||||
"zunyishi": "遵义"
|
||||
},
|
||||
"hainan": {
|
||||
"baishalizuzizhixian": "白沙黎族自治县",
|
||||
"baotinglizumiaozuzizhixian": "保亭黎族苗族自治县",
|
||||
"changjianglizuzizhixian": "昌江黎族自治县",
|
||||
"chengmaixian": "澄迈县",
|
||||
"danzhou": "儋州",
|
||||
"danzhoushi": "儋州",
|
||||
"dinganxian": "定安县",
|
||||
"dongfang": "东方市",
|
||||
"dongfangshi": "东方市",
|
||||
"haikou": "海口",
|
||||
"haikoushi": "海口",
|
||||
"hainanshengzizhiquzhixiaxianjixingzhengquhua": "海南省-自治区直辖县级行政区划",
|
||||
"haitangqu": "海棠区",
|
||||
"jiyangqu": "吉阳区",
|
||||
"ledonglizuzizhixian": "乐东黎族自治县",
|
||||
"lingaoxian": "临高县",
|
||||
"lingshuilizuzizhixian": "陵水黎族自治县",
|
||||
"longhuaqu": "龙华区",
|
||||
"meilanqu": "美兰区",
|
||||
"nanshaqundao": "南沙群岛",
|
||||
"qionghai": "琼海市",
|
||||
"qionghaishi": "琼海市",
|
||||
"qiongshanqu": "琼山区",
|
||||
"qiongzhonglizumiaozuzizhixian": "琼中黎族苗族自治县",
|
||||
"sansha": "三沙",
|
||||
"sanshashi": "三沙",
|
||||
"sanya": "三亚",
|
||||
"sanyashi": "三亚",
|
||||
"shixiaqu": "市辖区",
|
||||
"tianyaqu": "天涯区",
|
||||
"tunchangxian": "屯昌县",
|
||||
"wanning": "万宁市",
|
||||
"wanningshi": "万宁市",
|
||||
"wenchang": "文昌市",
|
||||
"wenchangshi": "文昌市",
|
||||
"wuzhishan": "五指山市",
|
||||
"wuzhishanshi": "五指山市",
|
||||
"xishaqundao": "西沙群岛",
|
||||
"xiuyingqu": "秀英区",
|
||||
"yazhouqu": "崖州区",
|
||||
"zhongshaqundaodedaojiaojiqihaiyu": "中沙群岛的岛礁及其海域"
|
||||
},
|
||||
"hebei": {
|
||||
"anciqu": "安次区",
|
||||
"anguo": "安国市",
|
||||
"anguoshi": "安国市",
|
||||
"anpingxian": "安平县",
|
||||
"anxinxian": "安新县",
|
||||
"baixiangxian": "柏乡县",
|
||||
"baoding": "保定",
|
||||
"baodingbaigouxincheng": "保定白沟新城",
|
||||
"baodinggaoxinjishuchanyekaifaqu": "保定高新技术产业开发区",
|
||||
"baodingshi": "保定",
|
||||
"bazhou": "霸州市",
|
||||
"bazhoushi": "霸州市",
|
||||
"beidaihequ": "北戴河区",
|
||||
"beidaihexinqu": "北戴河新区",
|
||||
"boyexian": "博野县",
|
||||
"cangxian": "沧县",
|
||||
"cangzhou": "沧州",
|
||||
"cangzhoubohaixinqu": "沧州渤海新区",
|
||||
"cangzhougaoxinjishuchanyekaifaqu": "沧州高新技术产业开发区",
|
||||
"cangzhoushi": "沧州",
|
||||
"caofeidianqu": "曹妃甸区",
|
||||
"changanqu": "长安区",
|
||||
"changlixian": "昌黎县",
|
||||
"chenganxian": "成安县",
|
||||
"chengde": "承德",
|
||||
"chengdegaoxinjishuchanyekaifaqu": "承德高新技术产业开发区",
|
||||
"chengdeshi": "承德",
|
||||
"chengdexian": "承德县",
|
||||
"chichengxian": "赤城县",
|
||||
"chongliqu": "崇礼区",
|
||||
"cixian": "磁县",
|
||||
"congtaiqu": "丛台区",
|
||||
"dachanghuizuzizhixian": "大厂回族自治县",
|
||||
"dachengxian": "大城县",
|
||||
"damingxian": "大名县",
|
||||
"dingxingxian": "定兴县",
|
||||
"dingzhou": "定州市",
|
||||
"dingzhoushi": "定州市",
|
||||
"dongguangxian": "东光县",
|
||||
"feixiangqu": "肥乡区",
|
||||
"fengfengkuangqu": "峰峰矿区",
|
||||
"fengnanqu": "丰南区",
|
||||
"fengningmanzuzizhixian": "丰宁满族自治县",
|
||||
"fengrunqu": "丰润区",
|
||||
"fuchengxian": "阜城县",
|
||||
"funingqu": "抚宁区",
|
||||
"fupingxian": "阜平县",
|
||||
"fuxingqu": "复兴区",
|
||||
"gaobeidian": "高碑店市",
|
||||
"gaobeidianshi": "高碑店市",
|
||||
"gaochengqu": "藁城区",
|
||||
"gaoyangxian": "高阳县",
|
||||
"gaoyixian": "高邑县",
|
||||
"guangpingxian": "广平县",
|
||||
"guangyangqu": "广阳区",
|
||||
"guangzongxian": "广宗县",
|
||||
"guantaoxian": "馆陶县",
|
||||
"guanxian": "固安县",
|
||||
"guchengxian": "故城县",
|
||||
"guyequ": "古冶区",
|
||||
"guyuanxian": "沽源县",
|
||||
"haigangqu": "海港区",
|
||||
"haixingxian": "海兴县",
|
||||
"handan": "邯郸",
|
||||
"handanjinanxinqu": "邯郸冀南新区",
|
||||
"handanjingjijishukaifaqu": "邯郸经济技术开发区",
|
||||
"handanshi": "邯郸",
|
||||
"hanshanqu": "邯山区",
|
||||
"hebeicangzhoujingjikaifaqu": "河北沧州经济开发区",
|
||||
"hebeihengshuigaoxinjishuchanyekaifaqu": "河北衡水高新技术产业开发区",
|
||||
"hebeitangshanhaigangjingjikaifaqu": "河北唐山海港经济开发区",
|
||||
"hebeitangshanlutaijingjikaifaqu": "河北唐山芦台经济开发区",
|
||||
"hebeixingtaijingjikaifaqu": "河北邢台经济开发区",
|
||||
"hejian": "河间市",
|
||||
"hejianshi": "河间市",
|
||||
"hengshui": "衡水",
|
||||
"hengshuibinhuxinqu": "衡水滨湖新区",
|
||||
"hengshuishi": "衡水",
|
||||
"huaianxian": "怀安县",
|
||||
"huailaixian": "怀来县",
|
||||
"huanghua": "黄骅市",
|
||||
"huanghuashi": "黄骅市",
|
||||
"jingxian": "景县",
|
||||
"jingxingkuangqu": "井陉矿区",
|
||||
"jingxingxian": "井陉县",
|
||||
"jingxiuqu": "竞秀区",
|
||||
"jinzhou": "晋州市",
|
||||
"jinzhoushi": "晋州市",
|
||||
"jizexian": "鸡泽县",
|
||||
"jizhouqu": "冀州区",
|
||||
"juluxian": "巨鹿县",
|
||||
"kaipingqu": "开平区",
|
||||
"kangbaoxian": "康保县",
|
||||
"kuanchengmanzuzizhixian": "宽城满族自治县",
|
||||
"laishuixian": "涞水县",
|
||||
"laiyuanxian": "涞源县",
|
||||
"langfang": "廊坊",
|
||||
"langfangjingjijishukaifaqu": "廊坊经济技术开发区",
|
||||
"langfangshi": "廊坊",
|
||||
"laotingxian": "乐亭县",
|
||||
"lianchiqu": "莲池区",
|
||||
"linchengxian": "临城县",
|
||||
"lingshouxian": "灵寿县",
|
||||
"linxixian": "临西县",
|
||||
"linzhangxian": "临漳县",
|
||||
"lixian": "蠡县",
|
||||
"longhuaxian": "隆化县",
|
||||
"longyaoxian": "隆尧县",
|
||||
"luanchengqu": "栾城区",
|
||||
"luannanxian": "滦南县",
|
||||
"luanpingxian": "滦平县",
|
||||
"luanzhou": "滦州市",
|
||||
"luanzhoushi": "滦州市",
|
||||
"lubeiqu": "路北区",
|
||||
"lulongxian": "卢龙县",
|
||||
"lunanqu": "路南区",
|
||||
"luquanqu": "鹿泉区",
|
||||
"manchengqu": "满城区",
|
||||
"mengcunhuizuzizhixian": "孟村回族自治县",
|
||||
"nangong": "南宫市",
|
||||
"nangongshi": "南宫市",
|
||||
"nanhequ": "南和区",
|
||||
"nanpixian": "南皮县",
|
||||
"neiqiuxian": "内丘县",
|
||||
"ningjinxian": "宁晋县",
|
||||
"pingquan": "平泉市",
|
||||
"pingquanshi": "平泉市",
|
||||
"pingshanxian": "平山县",
|
||||
"pingxiangxian": "平乡县",
|
||||
"potou": "泊头市",
|
||||
"potoushi": "泊头市",
|
||||
"qianan": "迁安市",
|
||||
"qiananshi": "迁安市",
|
||||
"qianxixian": "迁西县",
|
||||
"qiaodongqu": "桥东区",
|
||||
"qiaoxiqu": "桥西区",
|
||||
"qinghexian": "清河县",
|
||||
"qinglongmanzuzizhixian": "青龙满族自治县",
|
||||
"qingxian": "青县",
|
||||
"qingyuanqu": "清苑区",
|
||||
"qinhuangdao": "秦皇岛",
|
||||
"qinhuangdaoshi": "秦皇岛",
|
||||
"qinhuangdaoshijingjijishukaifaqu": "秦皇岛市经济技术开发区",
|
||||
"qiuxian": "邱县",
|
||||
"quyangxian": "曲阳县",
|
||||
"quzhouxian": "曲周县",
|
||||
"raoyangxian": "饶阳县",
|
||||
"renqiu": "任丘市",
|
||||
"renqiushi": "任丘市",
|
||||
"renzequ": "任泽区",
|
||||
"rongchengxian": "容城县",
|
||||
"sanhe": "三河市",
|
||||
"sanheshi": "三河市",
|
||||
"shahe": "沙河市",
|
||||
"shaheshi": "沙河市",
|
||||
"shangyixian": "尚义县",
|
||||
"shanhaiguanqu": "山海关区",
|
||||
"shenzexian": "深泽县",
|
||||
"shenzhou": "深州市",
|
||||
"shenzhoushi": "深州市",
|
||||
"shexian": "涉县",
|
||||
"shijiazhuang": "石家庄",
|
||||
"shijiazhuanggaoxinjishuchanyekaifaqu": "石家庄高新技术产业开发区",
|
||||
"shijiazhuangshi": "石家庄",
|
||||
"shijiazhuangxunhuanhuagongyuanqu": "石家庄循环化工园区",
|
||||
"shixiaqu": "市辖区",
|
||||
"shuangluanqu": "双滦区",
|
||||
"shuangqiaoqu": "双桥区",
|
||||
"shunpingxian": "顺平县",
|
||||
"suningxian": "肃宁县",
|
||||
"tangshan": "唐山",
|
||||
"tangshangaoxinjishuchanyekaifaqu": "唐山高新技术产业开发区",
|
||||
"tangshanshi": "唐山",
|
||||
"tangshanshihanguguanliqu": "唐山市汉沽管理区",
|
||||
"tangxian": "唐县",
|
||||
"taochengqu": "桃城区",
|
||||
"wangdouxian": "望都县",
|
||||
"wanquanqu": "万全区",
|
||||
"weichangmanzumengguzuzizhixian": "围场满族蒙古族自治县",
|
||||
"weixian": "魏县",
|
||||
"wenanxian": "文安县",
|
||||
"wuan": "武安市",
|
||||
"wuanshi": "武安市",
|
||||
"wujixian": "无极县",
|
||||
"wuqiangxian": "武强县",
|
||||
"wuqiaoxian": "吴桥县",
|
||||
"wuyixian": "武邑县",
|
||||
"xiahuayuanqu": "下花园区",
|
||||
"xiangdouqu": "襄都区",
|
||||
"xianghexian": "香河县",
|
||||
"xianxian": "献县",
|
||||
"xindouqu": "信都区",
|
||||
"xinglongxian": "兴隆县",
|
||||
"xingtai": "邢台",
|
||||
"xingtaishi": "邢台",
|
||||
"xingtangxian": "行唐县",
|
||||
"xinhexian": "新河县",
|
||||
"xinhuaqu": "新华区",
|
||||
"xinji": "辛集市",
|
||||
"xinjishi": "辛集市",
|
||||
"xinle": "新乐市",
|
||||
"xinleshi": "新乐市",
|
||||
"xiongxian": "雄县",
|
||||
"xuanhuaqu": "宣化区",
|
||||
"xushuiqu": "徐水区",
|
||||
"yangyuanxian": "阳原县",
|
||||
"yanshanxian": "盐山县",
|
||||
"yingshouyingzikuangqu": "鹰手营子矿区",
|
||||
"yixian": "易县",
|
||||
"yongnianqu": "永年区",
|
||||
"yongqingxian": "永清县",
|
||||
"yuanshixian": "元氏县",
|
||||
"yuhuaqu": "裕华区",
|
||||
"yunhequ": "运河区",
|
||||
"yutianxian": "玉田县",
|
||||
"yuxian": "蔚县",
|
||||
"zanhuangxian": "赞皇县",
|
||||
"zaoqiangxian": "枣强县",
|
||||
"zhangbeixian": "张北县",
|
||||
"zhangjiakou": "张家口",
|
||||
"zhangjiakoujingjikaifaqu": "张家口经济开发区",
|
||||
"zhangjiakoushi": "张家口",
|
||||
"zhangjiakoushichabeiguanliqu": "张家口市察北管理区",
|
||||
"zhangjiakoushisaibeiguanliqu": "张家口市塞北管理区",
|
||||
"zhaoxian": "赵县",
|
||||
"zhengdingxian": "正定县",
|
||||
"zhuoluxian": "涿鹿县",
|
||||
"zhuozhou": "涿州市",
|
||||
"zhuozhoushi": "涿州市",
|
||||
"zunhua": "遵化市",
|
||||
"zunhuashi": "遵化市"
|
||||
},
|
||||
"heilongjiang": {
|
||||
"achengqu": "阿城区",
|
||||
"aihuiqu": "爱辉区",
|
||||
"aiminqu": "爱民区",
|
||||
"anda": "安达市",
|
||||
"andashi": "安达市",
|
||||
"angangxiqu": "昂昂溪区",
|
||||
"baiquanxian": "拜泉县",
|
||||
"baoqingxian": "宝清县",
|
||||
"baoshanqu": "宝山区",
|
||||
"bayanxian": "巴彦县",
|
||||
"bei": "北林区",
|
||||
"beian": "北安市",
|
||||
"beianshi": "北安市",
|
||||
"beilinqu": "北林区",
|
||||
"binxian": "宾县",
|
||||
"bolixian": "勃利县",
|
||||
"chengzihequ": "城子河区",
|
||||
"daoliqu": "道里区",
|
||||
"daowaiqu": "道外区",
|
||||
"daqing": "大庆",
|
||||
"daqinggaoxinjishuchanyekaifaqu": "大庆高新技术产业开发区",
|
||||
"daqingshanxian": "大箐山县",
|
||||
"daqingshi": "大庆",
|
||||
"datongqu": "大同区",
|
||||
"daxinganling": "大兴安岭",
|
||||
"daxinganlingdiqu": "大兴安岭",
|
||||
"didaoqu": "滴道区",
|
||||
"donganqu": "东安区",
|
||||
"dongfengqu": "东风区",
|
||||
"dongning": "东宁市",
|
||||
"dongningshi": "东宁市",
|
||||
"dongshanqu": "东山区",
|
||||
"duerbotemengguzuzizhixian": "杜尔伯特蒙古族自治县",
|
||||
"fangzhengxian": "方正县",
|
||||
"fenglinxian": "丰林县",
|
||||
"fujin": "富锦市",
|
||||
"fujinshi": "富锦市",
|
||||
"fulaerjiqu": "富拉尔基区",
|
||||
"fuyuan": "抚远市",
|
||||
"fuyuanshi": "抚远市",
|
||||
"fuyuxian": "富裕县",
|
||||
"gannanxian": "甘南县",
|
||||
"gongnongqu": "工农区",
|
||||
"haerbin": "哈尔滨",
|
||||
"haerbinshi": "哈尔滨",
|
||||
"hailin": "海林市",
|
||||
"hailinshi": "海林市",
|
||||
"hailun": "海伦市",
|
||||
"hailunshi": "海伦市",
|
||||
"hegang": "鹤岗",
|
||||
"hegangshi": "鹤岗",
|
||||
"heihe": "黑河",
|
||||
"heiheshi": "黑河",
|
||||
"hengshanqu": "恒山区",
|
||||
"honggangqu": "红岗区",
|
||||
"huachuanxian": "桦川县",
|
||||
"huananxian": "桦南县",
|
||||
"hulanqu": "呼兰区",
|
||||
"hulin": "虎林市",
|
||||
"hulinshi": "虎林市",
|
||||
"humaxian": "呼玛县",
|
||||
"huzhongqu": "呼中区",
|
||||
"jiagedaqiqu": "加格达奇区",
|
||||
"jiamusi": "佳木斯",
|
||||
"jiamusishi": "佳木斯",
|
||||
"jianhuaqu": "建华区",
|
||||
"jianshanqu": "尖山区",
|
||||
"jiaoqu": "郊区",
|
||||
"jiayinxian": "嘉荫县",
|
||||
"jidongxian": "鸡东县",
|
||||
"jiguanqu": "鸡冠区",
|
||||
"jin": "金林区",
|
||||
"jinlinqu": "金林区",
|
||||
"jixi": "鸡西",
|
||||
"jixianxian": "集贤县",
|
||||
"jixishi": "鸡西",
|
||||
"kedongxian": "克东县",
|
||||
"keshanxian": "克山县",
|
||||
"lanxixian": "兰西县",
|
||||
"lindianxian": "林甸县",
|
||||
"lingdongqu": "岭东区",
|
||||
"linkouxian": "林口县",
|
||||
"lishuqu": "梨树区",
|
||||
"longfengqu": "龙凤区",
|
||||
"longjiangxian": "龙江县",
|
||||
"longshaqu": "龙沙区",
|
||||
"luobeixian": "萝北县",
|
||||
"mashanqu": "麻山区",
|
||||
"meilisidawoerzuqu": "梅里斯达斡尔族区",
|
||||
"mingshuixian": "明水县",
|
||||
"mishan": "密山市",
|
||||
"mishanshi": "密山市",
|
||||
"mohe": "漠河市",
|
||||
"moheshi": "漠河市",
|
||||
"mudanjiang": "牡丹江",
|
||||
"mudanjiangjingjijishukaifaqu": "牡丹江经济技术开发区",
|
||||
"mudanjiangshi": "牡丹江",
|
||||
"mulanxian": "木兰县",
|
||||
"muleng": "穆棱市",
|
||||
"mulengshi": "穆棱市",
|
||||
"nanchaxian": "南岔县",
|
||||
"nangangqu": "南岗区",
|
||||
"nanshanqu": "南山区",
|
||||
"nehe": "讷河市",
|
||||
"neheshi": "讷河市",
|
||||
"nenjiang": "嫩江市",
|
||||
"nenjiangshi": "嫩江市",
|
||||
"nianzishanqu": "碾子山区",
|
||||
"ningan": "宁安市",
|
||||
"ninganshi": "宁安市",
|
||||
"pingfangqu": "平房区",
|
||||
"qianjinqu": "前进区",
|
||||
"qiezihequ": "茄子河区",
|
||||
"qinganxian": "庆安县",
|
||||
"qinggangxian": "青冈县",
|
||||
"qiqihaer": "齐齐哈尔",
|
||||
"qiqihaershi": "齐齐哈尔",
|
||||
"qitaihe": "七台河",
|
||||
"qitaiheshi": "七台河",
|
||||
"ranghuluqu": "让胡路区",
|
||||
"raohexian": "饶河县",
|
||||
"saertuqu": "萨尔图区",
|
||||
"shangzhi": "尚志市",
|
||||
"shangzhishi": "尚志市",
|
||||
"shixiaqu": "市辖区",
|
||||
"shuangchengqu": "双城区",
|
||||
"shuangyashan": "双鸭山",
|
||||
"shuangyashanshi": "双鸭山",
|
||||
"sifangtaiqu": "四方台区",
|
||||
"songbeiqu": "松北区",
|
||||
"songlingqu": "松岭区",
|
||||
"suibinxian": "绥滨县",
|
||||
"suifenhe": "绥芬河市",
|
||||
"suifenheshi": "绥芬河市",
|
||||
"suihua": "绥化",
|
||||
"suihuashi": "绥化",
|
||||
"suilengxian": "绥棱县",
|
||||
"sunwuxian": "孙吴县",
|
||||
"tahexian": "塔河县",
|
||||
"tailaixian": "泰来县",
|
||||
"tangwangxian": "汤旺县",
|
||||
"tangyuanxian": "汤原县",
|
||||
"taoshanqu": "桃山区",
|
||||
"tiefengqu": "铁锋区",
|
||||
"tieli": "铁力市",
|
||||
"tielishi": "铁力市",
|
||||
"tonghexian": "通河县",
|
||||
"tongjiang": "同江市",
|
||||
"tongjiangshi": "同江市",
|
||||
"wangkuixian": "望奎县",
|
||||
"wuchang": "五常市",
|
||||
"wuchangshi": "五常市",
|
||||
"wucuiqu": "乌翠区",
|
||||
"wudalianchi": "五大连池市",
|
||||
"wudalianchishi": "五大连池市",
|
||||
"xiangfangqu": "香坊区",
|
||||
"xiangyangqu": "向阳区",
|
||||
"xianqu": "西安区",
|
||||
"xin": "新林区",
|
||||
"xinganqu": "兴安区",
|
||||
"xingshanqu": "兴山区",
|
||||
"xinlinqu": "新林区",
|
||||
"xinxingqu": "新兴区",
|
||||
"xunkexian": "逊克县",
|
||||
"yangmingqu": "阳明区",
|
||||
"yanshouxian": "延寿县",
|
||||
"yianxian": "依安县",
|
||||
"yichun": "伊春",
|
||||
"yichunshi": "伊春",
|
||||
"yilanxian": "依兰县",
|
||||
"yimeiqu": "伊美区",
|
||||
"youhaoqu": "友好区",
|
||||
"youyixian": "友谊县",
|
||||
"zhaodong": "肇东市",
|
||||
"zhaodongshi": "肇东市",
|
||||
"zhaoyuanxian": "肇源县",
|
||||
"zhaozhouxian": "肇州县"
|
||||
},
|
||||
"henan": {
|
||||
"anyang": "安阳",
|
||||
"anyanggaoxinjishuchanyekaifaqu": "安阳高新技术产业开发区",
|
||||
"anyangshi": "安阳",
|
||||
"anyangxian": "安阳县",
|
||||
"baofengxian": "宝丰县",
|
||||
"beiguanqu": "北关区",
|
||||
"biyangxian": "泌阳县",
|
||||
"boaixian": "博爱县",
|
||||
"chanhehuizuqu": "瀍河回族区",
|
||||
"chuanhuiqu": "川汇区",
|
||||
"danchengxian": "郸城县",
|
||||
"dengfeng": "登封市",
|
||||
"dengfengshi": "登封市",
|
||||
"dengzhou": "邓州市",
|
||||
"dengzhoushi": "邓州市",
|
||||
"erqiqu": "二七区",
|
||||
"fangchengxian": "方城县",
|
||||
"fanxian": "范县",
|
||||
"fengqiuxian": "封丘县",
|
||||
"fengquanqu": "凤泉区",
|
||||
"fugouxian": "扶沟县",
|
||||
"gongyi": "巩义市",
|
||||
"gongyishi": "巩义市",
|
||||
"guanchenghuizuqu": "管城回族区",
|
||||
"guangshanxian": "光山县",
|
||||
"gulouqu": "鼓楼区",
|
||||
"gushixian": "固始县",
|
||||
"hebi": "鹤壁",
|
||||
"hebijingjijishukaifaqu": "鹤壁经济技术开发区",
|
||||
"hebishi": "鹤壁",
|
||||
"henanpuyanggongyeyuanqu": "河南濮阳工业园区",
|
||||
"henansanmenxiajingjikaifaqu": "河南三门峡经济开发区",
|
||||
"henanshangqiujingjikaifaqu": "河南商丘经济开发区",
|
||||
"henanshengshengzhixiaxianjixingzhengquhua": "河南省-省直辖县级行政区划",
|
||||
"henanzhoukoujingjikaifaqu": "河南周口经济开发区",
|
||||
"henanzhumadianjingjikaifaqu": "河南驻马店经济开发区",
|
||||
"heshanqu": "鹤山区",
|
||||
"hongqiqu": "红旗区",
|
||||
"huaibinxian": "淮滨县",
|
||||
"huaiyangqu": "淮阳区",
|
||||
"hualongqu": "华龙区",
|
||||
"huangchuanxian": "潢川县",
|
||||
"huaxian": "滑县",
|
||||
"hubinqu": "湖滨区",
|
||||
"huijiqu": "惠济区",
|
||||
"huixian": "辉县市",
|
||||
"huixianshi": "辉县市",
|
||||
"huojiaxian": "获嘉县",
|
||||
"jiananqu": "建安区",
|
||||
"jianxiqu": "涧西区",
|
||||
"jiaozuo": "焦作",
|
||||
"jiaozuochengxiangyitihuashifanqu": "焦作城乡一体化示范区",
|
||||
"jiaozuoshi": "焦作",
|
||||
"jiaxian": "郏县",
|
||||
"jiefangqu": "解放区",
|
||||
"jiliqu": "吉利区",
|
||||
"jinshuiqu": "金水区",
|
||||
"jiyuan": "济源市",
|
||||
"jiyuanshi": "济源市",
|
||||
"junxian": "浚县",
|
||||
"kaifeng": "开封",
|
||||
"kaifengshi": "开封",
|
||||
"lankaoxian": "兰考县",
|
||||
"laochengqu": "老城区",
|
||||
"liangyuanqu": "梁园区",
|
||||
"lingbao": "灵宝市",
|
||||
"lingbaoshi": "灵宝市",
|
||||
"linyingxian": "临颍县",
|
||||
"linzhou": "林州市",
|
||||
"linzhoushi": "林州市",
|
||||
"longanqu": "龙安区",
|
||||
"longtingqu": "龙亭区",
|
||||
"luanchuanxian": "栾川县",
|
||||
"luolongqu": "洛龙区",
|
||||
"luoningxian": "洛宁县",
|
||||
"luoshanxian": "罗山县",
|
||||
"luoyang": "洛阳",
|
||||
"luoyanggaoxinjishuchanyekaifaqu": "洛阳高新技术产业开发区",
|
||||
"luoyangshi": "洛阳",
|
||||
"lushanxian": "鲁山县",
|
||||
"lushixian": "卢氏县",
|
||||
"luyixian": "鹿邑县",
|
||||
"macunqu": "马村区",
|
||||
"mengjinqu": "孟津区",
|
||||
"mengjinxian": "孟津县",
|
||||
"mengzhou": "孟州市",
|
||||
"mengzhoushi": "孟州市",
|
||||
"mianchixian": "渑池县",
|
||||
"minquanxian": "民权县",
|
||||
"muyequ": "牧野区",
|
||||
"nanyang": "南阳",
|
||||
"nanyanggaoxinjishuchanyekaifaqu": "南阳高新技术产业开发区",
|
||||
"nanyangshi": "南阳",
|
||||
"nanyangshichengxiangyitihuashifanqu": "南阳市城乡一体化示范区",
|
||||
"nanyuexian": "南乐县",
|
||||
"nanzhaoxian": "南召县",
|
||||
"neihuangxian": "内黄县",
|
||||
"neixiangxian": "内乡县",
|
||||
"ninglingxian": "宁陵县",
|
||||
"pingdingshan": "平顶山",
|
||||
"pingdingshangaoxinjishuchanyekaifaqu": "平顶山高新技术产业开发区",
|
||||
"pingdingshanshi": "平顶山",
|
||||
"pingdingshanshichengxiangyitihuashifanqu": "平顶山市城乡一体化示范区",
|
||||
"pingqiaoqu": "平桥区",
|
||||
"pingyuxian": "平舆县",
|
||||
"puyang": "濮阳",
|
||||
"puyangjingjijishukaifaqu": "濮阳经济技术开发区",
|
||||
"puyangshi": "濮阳",
|
||||
"puyangxian": "濮阳县",
|
||||
"qibinqu": "淇滨区",
|
||||
"qingfengxian": "清丰县",
|
||||
"qinyang": "沁阳市",
|
||||
"qinyangshi": "沁阳市",
|
||||
"qixian": "杞县",
|
||||
"queshanxian": "确山县",
|
||||
"runanxian": "汝南县",
|
||||
"ruyangxian": "汝阳县",
|
||||
"ruzhou": "汝州市",
|
||||
"ruzhoushi": "汝州市",
|
||||
"sanmenxia": "三门峡",
|
||||
"sanmenxiashi": "三门峡",
|
||||
"shanchengqu": "山城区",
|
||||
"shangcaixian": "上蔡县",
|
||||
"shangchengxian": "商城县",
|
||||
"shangjiequ": "上街区",
|
||||
"shangqiu": "商丘",
|
||||
"shangqiushi": "商丘",
|
||||
"shangshuixian": "商水县",
|
||||
"shanyangqu": "山阳区",
|
||||
"shanzhouqu": "陕州区",
|
||||
"shenqiuxian": "沈丘县",
|
||||
"sheqixian": "社旗县",
|
||||
"shihequ": "浉河区",
|
||||
"shilongqu": "石龙区",
|
||||
"shixiaqu": "市辖区",
|
||||
"shunhehuizuqu": "顺河回族区",
|
||||
"songxian": "嵩县",
|
||||
"suipingxian": "遂平县",
|
||||
"suixian": "睢县",
|
||||
"suiyangqu": "睢阳区",
|
||||
"tahe": "漯河",
|
||||
"tahejingjijishukaifaqu": "漯河经济技术开发区",
|
||||
"taheshi": "漯河",
|
||||
"taikangxian": "太康县",
|
||||
"taiqianxian": "台前县",
|
||||
"tanghexian": "唐河县",
|
||||
"tangyinxian": "汤阴县",
|
||||
"tongbaixian": "桐柏县",
|
||||
"tongxuxian": "通许县",
|
||||
"wanchengqu": "宛城区",
|
||||
"weibinqu": "卫滨区",
|
||||
"weidongqu": "卫东区",
|
||||
"weidouqu": "魏都区",
|
||||
"weihui": "卫辉市",
|
||||
"weihuishi": "卫辉市",
|
||||
"weishixian": "尉氏县",
|
||||
"wenfengqu": "文峰区",
|
||||
"wenxian": "温县",
|
||||
"wolongqu": "卧龙区",
|
||||
"wugang": "舞钢市",
|
||||
"wugangshi": "舞钢市",
|
||||
"wuyangxian": "舞阳县",
|
||||
"wuzhixian": "武陟县",
|
||||
"xiangcheng": "项城市",
|
||||
"xiangchengshi": "项城市",
|
||||
"xiangchengxian": "襄城县",
|
||||
"xiangfuqu": "祥符区",
|
||||
"xiayixian": "夏邑县",
|
||||
"xichuanxian": "淅川县",
|
||||
"xigongqu": "西工区",
|
||||
"xihuaxian": "西华县",
|
||||
"xinanxian": "新安县",
|
||||
"xincaixian": "新蔡县",
|
||||
"xingyang": "荥阳市",
|
||||
"xingyangshi": "荥阳市",
|
||||
"xinhuaqu": "新华区",
|
||||
"xinmi": "新密市",
|
||||
"xinmishi": "新密市",
|
||||
"xinxian": "新县",
|
||||
"xinxiang": "新乡",
|
||||
"xinxianggaoxinjishuchanyekaifaqu": "新乡高新技术产业开发区",
|
||||
"xinxiangjingjijishukaifaqu": "新乡经济技术开发区",
|
||||
"xinxiangshi": "新乡",
|
||||
"xinxiangshipingyuanchengxiangyitihuashifanqu": "新乡市平原城乡一体化示范区",
|
||||
"xinxiangxian": "新乡县",
|
||||
"xinyang": "信阳",
|
||||
"xinyanggaoxinjishuchanyekaifaqu": "信阳高新技术产业开发区",
|
||||
"xinyangshi": "信阳",
|
||||
"xinyexian": "新野县",
|
||||
"xinzheng": "新郑市",
|
||||
"xinzhengshi": "新郑市",
|
||||
"xipingxian": "西平县",
|
||||
"xiuwuxian": "修武县",
|
||||
"xixian": "息县",
|
||||
"xixiaxian": "西峡县",
|
||||
"xuchang": "许昌",
|
||||
"xuchangjingjijishukaifaqu": "许昌经济技术开发区",
|
||||
"xuchangshi": "许昌",
|
||||
"yanchengqu": "郾城区",
|
||||
"yanjinxian": "延津县",
|
||||
"yanlingxian": "鄢陵县",
|
||||
"yanshi": "偃师市",
|
||||
"yanshiqu": "偃师区",
|
||||
"yanshishi": "偃师市",
|
||||
"yexian": "叶县",
|
||||
"yichengqu": "驿城区",
|
||||
"yichuanxian": "伊川县",
|
||||
"yima": "义马市",
|
||||
"yimashi": "义马市",
|
||||
"yindouqu": "殷都区",
|
||||
"yiyangxian": "宜阳县",
|
||||
"yongcheng": "永城市",
|
||||
"yongchengshi": "永城市",
|
||||
"yuanhuiqu": "源汇区",
|
||||
"yuanyangxian": "原阳县",
|
||||
"yuchengxian": "虞城县",
|
||||
"yudongzonghewuliuchanyejujiqu": "豫东综合物流产业聚集区",
|
||||
"yuwangtaiqu": "禹王台区",
|
||||
"yuzhou": "禹州市",
|
||||
"yuzhoushi": "禹州市",
|
||||
"zhangge": "长葛市",
|
||||
"zhanggeshi": "长葛市",
|
||||
"zhangyuan": "长垣市",
|
||||
"zhangyuanshi": "长垣市",
|
||||
"zhanhequ": "湛河区",
|
||||
"zhaolingqu": "召陵区",
|
||||
"zhechengxian": "柘城县",
|
||||
"zhengyangxian": "正阳县",
|
||||
"zhengzhou": "郑州",
|
||||
"zhengzhougaoxinjishuchanyekaifaqu": "郑州高新技术产业开发区",
|
||||
"zhengzhouhangkonggangjingjizongheshiyanqu": "郑州航空港经济综合实验区",
|
||||
"zhengzhoujingjijishukaifaqu": "郑州经济技术开发区",
|
||||
"zhengzhoushi": "郑州",
|
||||
"zhenpingxian": "镇平县",
|
||||
"zhongmuxian": "中牟县",
|
||||
"zhongyuanqu": "中原区",
|
||||
"zhongzhanqu": "中站区",
|
||||
"zhoukou": "周口",
|
||||
"zhoukoushi": "周口",
|
||||
"zhumadian": "驻马店",
|
||||
"zhumadianshi": "驻马店"
|
||||
},
|
||||
"hubei": {
|
||||
"anlu": "安陆市",
|
||||
"anlushi": "安陆市",
|
||||
"badongxian": "巴东县",
|
||||
"baokangxian": "保康县",
|
||||
"caidianqu": "蔡甸区",
|
||||
"cengdouqu": "曾都区",
|
||||
"chibi": "赤壁市",
|
||||
"chibishi": "赤壁市",
|
||||
"chongyangxian": "崇阳县",
|
||||
"dangyang": "当阳市",
|
||||
"dangyangshi": "当阳市",
|
||||
"danjiangkou": "丹江口市",
|
||||
"danjiangkoushi": "丹江口市",
|
||||
"dawuxian": "大悟县",
|
||||
"daye": "大冶市",
|
||||
"dayeshi": "大冶市",
|
||||
"dianjunqu": "点军区",
|
||||
"dongbaoqu": "东宝区",
|
||||
"dongxihuqu": "东西湖区",
|
||||
"duodaoqu": "掇刀区",
|
||||
"echengqu": "鄂城区",
|
||||
"enshi": "恩施市",
|
||||
"enshishi": "恩施市",
|
||||
"enshitujiazumiaozu": "恩施土家族苗族",
|
||||
"enshitujiazumiaozuzizhizhou": "恩施土家族苗族",
|
||||
"ezhou": "鄂州",
|
||||
"ezhoushi": "鄂州",
|
||||
"fanchengqu": "樊城区",
|
||||
"fangxian": "房县",
|
||||
"gonganxian": "公安县",
|
||||
"guangshui": "广水市",
|
||||
"guangshuishi": "广水市",
|
||||
"guchengxian": "谷城县",
|
||||
"hanchuan": "汉川市",
|
||||
"hanchuanshi": "汉川市",
|
||||
"hannanqu": "汉南区",
|
||||
"hanyangqu": "汉阳区",
|
||||
"hefengxian": "鹤峰县",
|
||||
"honganxian": "红安县",
|
||||
"honghu": "洪湖市",
|
||||
"honghushi": "洪湖市",
|
||||
"hongshanqu": "洪山区",
|
||||
"huang": "黄石",
|
||||
"huanggang": "黄冈",
|
||||
"huanggangshi": "黄冈",
|
||||
"huangmeixian": "黄梅县",
|
||||
"huangpiqu": "黄陂区",
|
||||
"huangshi": "黄石",
|
||||
"huangshigangqu": "黄石港区",
|
||||
"huangshishi": "黄石",
|
||||
"huangzhouqu": "黄州区",
|
||||
"huarongqu": "华容区",
|
||||
"hubeishengzizhiquzhixiaxianjixingzhengquhua": "湖北省-自治区直辖县级行政区划",
|
||||
"jianganqu": "江岸区",
|
||||
"jianghanqu": "江汉区",
|
||||
"jianglingxian": "江陵县",
|
||||
"jiangxiaqu": "江夏区",
|
||||
"jianli": "监利市",
|
||||
"jianlishi": "监利市",
|
||||
"jianshixian": "建始县",
|
||||
"jiayuxian": "嘉鱼县",
|
||||
"jingmen": "荆门",
|
||||
"jingmenshi": "荆门",
|
||||
"jingshan": "京山市",
|
||||
"jingshanshi": "京山市",
|
||||
"jingzhou": "荆州",
|
||||
"jingzhoujingjijishukaifaqu": "荆州经济技术开发区",
|
||||
"jingzhouqu": "荆州区",
|
||||
"jingzhoushi": "荆州",
|
||||
"laifengxian": "来凤县",
|
||||
"laohekou": "老河口市",
|
||||
"laohekoushi": "老河口市",
|
||||
"liangzihuqu": "梁子湖区",
|
||||
"lichuan": "利川市",
|
||||
"lichuanshi": "利川市",
|
||||
"longganhuguanliqu": "龙感湖管理区",
|
||||
"luotianxian": "罗田县",
|
||||
"macheng": "麻城市",
|
||||
"machengshi": "麻城市",
|
||||
"maojianqu": "茅箭区",
|
||||
"nanzhangxian": "南漳县",
|
||||
"qianjiang": "潜江市",
|
||||
"qianjiangshi": "潜江市",
|
||||
"qiaokouqu": "硚口区",
|
||||
"qichunxian": "蕲春县",
|
||||
"qingshanqu": "青山区",
|
||||
"shashiqu": "沙市区",
|
||||
"shayangxian": "沙洋县",
|
||||
"shennongjia": "神农架林区",
|
||||
"shennongjialinqu": "神农架林区",
|
||||
"shishou": "石首市",
|
||||
"shishoushi": "石首市",
|
||||
"shixiaqu": "市辖区",
|
||||
"shiyan": "十堰",
|
||||
"shiyanshi": "十堰",
|
||||
"songzi": "松滋市",
|
||||
"songzishi": "松滋市",
|
||||
"suixian": "随县",
|
||||
"suizhou": "随州",
|
||||
"suizhoushi": "随州",
|
||||
"tianmen": "天门市",
|
||||
"tianmenshi": "天门市",
|
||||
"tieshanqu": "铁山区",
|
||||
"tongchengxian": "通城县",
|
||||
"tongshanxian": "通山县",
|
||||
"tuanfengxian": "团风县",
|
||||
"wuchangqu": "武昌区",
|
||||
"wufengtujiazuzizhixian": "五峰土家族自治县",
|
||||
"wuhan": "武汉",
|
||||
"wuhanshi": "武汉",
|
||||
"wujiagangqu": "伍家岗区",
|
||||
"wuxue": "武穴市",
|
||||
"wuxueshi": "武穴市",
|
||||
"xialuqu": "下陆区",
|
||||
"xiananqu": "咸安区",
|
||||
"xianfengxian": "咸丰县",
|
||||
"xiangchengqu": "襄城区",
|
||||
"xiangyang": "襄阳",
|
||||
"xiangyangshi": "襄阳",
|
||||
"xiangzhouqu": "襄州区",
|
||||
"xianning": "咸宁",
|
||||
"xianningshi": "咸宁",
|
||||
"xiantao": "仙桃市",
|
||||
"xiantaoshi": "仙桃市",
|
||||
"xiaochangxian": "孝昌县",
|
||||
"xiaogan": "孝感",
|
||||
"xiaoganshi": "孝感",
|
||||
"xiaonanqu": "孝南区",
|
||||
"xiaotingqu": "猇亭区",
|
||||
"xilingqu": "西陵区",
|
||||
"xingshanxian": "兴山县",
|
||||
"xinzhouqu": "新洲区",
|
||||
"xisaishanqu": "西塞山区",
|
||||
"xishuixian": "浠水县",
|
||||
"xuanenxian": "宣恩县",
|
||||
"yangxinxian": "阳新县",
|
||||
"yichang": "宜昌",
|
||||
"yichangshi": "宜昌",
|
||||
"yicheng": "宜城市",
|
||||
"yichengshi": "宜城市",
|
||||
"yidu": "宜都市",
|
||||
"yidushi": "宜都市",
|
||||
"yilingqu": "夷陵区",
|
||||
"yingcheng": "应城市",
|
||||
"yingchengshi": "应城市",
|
||||
"yingshanxian": "英山县",
|
||||
"yuananxian": "远安县",
|
||||
"yunmengxian": "云梦县",
|
||||
"yunxixian": "郧西县",
|
||||
"yunyangqu": "郧阳区",
|
||||
"zaoyang": "枣阳市",
|
||||
"zaoyangshi": "枣阳市",
|
||||
"zhangwanqu": "张湾区",
|
||||
"zhangyangtujiazuzizhixian": "长阳土家族自治县",
|
||||
"zhijiang": "枝江市",
|
||||
"zhijiangshi": "枝江市",
|
||||
"zhongxiang": "钟祥市",
|
||||
"zhongxiangshi": "钟祥市",
|
||||
"zhushanxian": "竹山县",
|
||||
"zhuxixian": "竹溪县",
|
||||
"ziguixian": "秭归县"
|
||||
},
|
||||
"hunan": {
|
||||
"anhuaxian": "安化县",
|
||||
"anrenxian": "安仁县",
|
||||
"anxiangxian": "安乡县",
|
||||
"baojingxian": "保靖县",
|
||||
"beihuqu": "北湖区",
|
||||
"beitaqu": "北塔区",
|
||||
"chalingxian": "茶陵县",
|
||||
"changde": "常德",
|
||||
"changdeshi": "常德",
|
||||
"changdeshixidongtingguanliqu": "常德市西洞庭管理区",
|
||||
"changning": "常宁市",
|
||||
"changningshi": "常宁市",
|
||||
"changsha": "长沙",
|
||||
"changshashi": "长沙",
|
||||
"changshaxian": "长沙县",
|
||||
"chengbumiaozuzizhixian": "城步苗族自治县",
|
||||
"chenxixian": "辰溪县",
|
||||
"chenzhou": "郴州",
|
||||
"chenzhoushi": "郴州",
|
||||
"cilixian": "慈利县",
|
||||
"daoxian": "道县",
|
||||
"daxiangqu": "大祥区",
|
||||
"dingchengqu": "鼎城区",
|
||||
"donganxian": "东安县",
|
||||
"dongkouxian": "洞口县",
|
||||
"fenghuangxian": "凤凰县",
|
||||
"furongqu": "芙蓉区",
|
||||
"guidongxian": "桂东县",
|
||||
"guiyangxian": "桂阳县",
|
||||
"guzhangxian": "古丈县",
|
||||
"hanshouxian": "汉寿县",
|
||||
"hechengqu": "鹤城区",
|
||||
"hengdongxian": "衡东县",
|
||||
"hengnanxian": "衡南县",
|
||||
"hengshanxian": "衡山县",
|
||||
"hengyang": "衡阳",
|
||||
"hengyangshi": "衡阳",
|
||||
"hengyangxian": "衡阳县",
|
||||
"hengyangzonghebaoshuiqu": "衡阳综合保税区",
|
||||
"heshanqu": "赫山区",
|
||||
"hetangqu": "荷塘区",
|
||||
"hongjiang": "洪江市",
|
||||
"hongjiangshi": "洪江市",
|
||||
"huaihua": "怀化",
|
||||
"huaihuashi": "怀化",
|
||||
"huaihuashihongjiangguanliqu": "怀化市洪江管理区",
|
||||
"huarongxian": "华容县",
|
||||
"huayuanxian": "花垣县",
|
||||
"huitongxian": "会同县",
|
||||
"hunanhengyanggaoxinjishuchanyeyuanqu": "湖南衡阳高新技术产业园区",
|
||||
"hunanhengyangsongmujingjikaifaqu": "湖南衡阳松木经济开发区",
|
||||
"hunanxiangtangaoxinjishuchanyeyuanqu": "湖南湘潭高新技术产业园区",
|
||||
"hunanyiyanggaoxinjishuchanyeyuanqu": "湖南益阳高新技术产业园区",
|
||||
"jiahexian": "嘉禾县",
|
||||
"jianghuayaozuzizhixian": "江华瑶族自治县",
|
||||
"jiangyongxian": "江永县",
|
||||
"jingzhoumiaozudongzuzizhixian": "靖州苗族侗族自治县",
|
||||
"jinshi": "津市市",
|
||||
"jinshishi": "津市市",
|
||||
"jishou": "吉首市",
|
||||
"jishoushi": "吉首市",
|
||||
"junshanqu": "君山区",
|
||||
"kaifuqu": "开福区",
|
||||
"lanshanxian": "蓝山县",
|
||||
"leiyang": "耒阳市",
|
||||
"leiyangshi": "耒阳市",
|
||||
"lengshuijiang": "冷水江市",
|
||||
"lengshuijiangshi": "冷水江市",
|
||||
"lengshuitanqu": "冷水滩区",
|
||||
"lianyuan": "涟源市",
|
||||
"lianyuanshi": "涟源市",
|
||||
"liling": "醴陵市",
|
||||
"lilingshi": "醴陵市",
|
||||
"linglingqu": "零陵区",
|
||||
"linlixian": "临澧县",
|
||||
"linwuxian": "临武县",
|
||||
"linxiang": "临湘市",
|
||||
"linxiangshi": "临湘市",
|
||||
"liuyang": "浏阳市",
|
||||
"liuyangshi": "浏阳市",
|
||||
"lixian": "澧县",
|
||||
"longhuixian": "隆回县",
|
||||
"longshanxian": "龙山县",
|
||||
"loudi": "娄底",
|
||||
"loudishi": "娄底",
|
||||
"louxingqu": "娄星区",
|
||||
"lukouqu": "渌口区",
|
||||
"lusongqu": "芦淞区",
|
||||
"luxixian": "泸溪县",
|
||||
"mayangmiaozuzizhixian": "麻阳苗族自治县",
|
||||
"miluo": "汨罗市",
|
||||
"miluoshi": "汨罗市",
|
||||
"nanxian": "南县",
|
||||
"nanyuequ": "南岳区",
|
||||
"ningxiang": "宁乡市",
|
||||
"ningxiangshi": "宁乡市",
|
||||
"ningyuanxian": "宁远县",
|
||||
"pingjiangxian": "平江县",
|
||||
"qidongxian": "祁东县",
|
||||
"qiyang": "祁阳市",
|
||||
"qiyangshi": "祁阳市",
|
||||
"qiyangxian": "祁阳县",
|
||||
"ruchengxian": "汝城县",
|
||||
"sangzhixian": "桑植县",
|
||||
"shaodong": "邵东市",
|
||||
"shaodongshi": "邵东市",
|
||||
"shaoshan": "韶山市",
|
||||
"shaoshanshi": "韶山市",
|
||||
"shaoyang": "邵阳",
|
||||
"shaoyangshi": "邵阳",
|
||||
"shaoyangxian": "邵阳县",
|
||||
"shifengqu": "石峰区",
|
||||
"shiguqu": "石鼓区",
|
||||
"shimenxian": "石门县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shuangfengxian": "双峰县",
|
||||
"shuangpaixian": "双牌县",
|
||||
"shuangqingqu": "双清区",
|
||||
"suiningxian": "绥宁县",
|
||||
"suxianqu": "苏仙区",
|
||||
"taojiangxian": "桃江县",
|
||||
"taoyuanxian": "桃源县",
|
||||
"tianxinqu": "天心区",
|
||||
"tianyuanqu": "天元区",
|
||||
"tongdaodongzuzizhixian": "通道侗族自治县",
|
||||
"wangchengqu": "望城区",
|
||||
"wugang": "武冈市",
|
||||
"wugangshi": "武冈市",
|
||||
"wulingqu": "武陵区",
|
||||
"wulingyuanqu": "武陵源区",
|
||||
"xiangtan": "湘潭",
|
||||
"xiangtanjiuhuashifanqu": "湘潭九华示范区",
|
||||
"xiangtanshi": "湘潭",
|
||||
"xiangtanxian": "湘潭县",
|
||||
"xiangtanzhaoshanshifanqu": "湘潭昭山示范区",
|
||||
"xiangxiang": "湘乡市",
|
||||
"xiangxiangshi": "湘乡市",
|
||||
"xiangxitujiazumiaozu": "湘西土家族苗族",
|
||||
"xiangxitujiazumiaozuzizhizhou": "湘西土家族苗族",
|
||||
"xiangyinxian": "湘阴县",
|
||||
"xinhuangdongzuzizhixian": "新晃侗族自治县",
|
||||
"xinhuaxian": "新化县",
|
||||
"xinningxian": "新宁县",
|
||||
"xinshaoxian": "新邵县",
|
||||
"xintianxian": "新田县",
|
||||
"xupuxian": "溆浦县",
|
||||
"yanfengqu": "雁峰区",
|
||||
"yanlingxian": "炎陵县",
|
||||
"yiyang": "益阳",
|
||||
"yiyangshi": "益阳",
|
||||
"yiyangshidatonghuguanliqu": "益阳市大通湖管理区",
|
||||
"yizhangxian": "宜章县",
|
||||
"yongdingqu": "永定区",
|
||||
"yongshunxian": "永顺县",
|
||||
"yongxingxian": "永兴县",
|
||||
"yongzhou": "永州",
|
||||
"yongzhoujingjijishukaifaqu": "永州经济技术开发区",
|
||||
"yongzhoushi": "永州",
|
||||
"yongzhoushihuilongweiguanliqu": "永州市回龙圩管理区",
|
||||
"youxian": "攸县",
|
||||
"yuanjiang": "沅江市",
|
||||
"yuanjiangshi": "沅江市",
|
||||
"yuanlingxian": "沅陵县",
|
||||
"yueluqu": "岳麓区",
|
||||
"yuetangqu": "岳塘区",
|
||||
"yueyang": "岳阳",
|
||||
"yueyanglouqu": "岳阳楼区",
|
||||
"yueyangshi": "岳阳",
|
||||
"yueyangshiquyuanguanliqu": "岳阳市屈原管理区",
|
||||
"yueyangxian": "岳阳县",
|
||||
"yuhuaqu": "雨花区",
|
||||
"yuhuqu": "雨湖区",
|
||||
"yunlongshifanqu": "云龙示范区",
|
||||
"yunxiqu": "云溪区",
|
||||
"zhangjiajie": "张家界",
|
||||
"zhangjiajieshi": "张家界",
|
||||
"zhengxiangqu": "蒸湘区",
|
||||
"zhijiangdongzuzizhixian": "芷江侗族自治县",
|
||||
"zhongfangxian": "中方县",
|
||||
"zhuhuiqu": "珠晖区",
|
||||
"zhuzhou": "株洲",
|
||||
"zhuzhoushi": "株洲",
|
||||
"zixing": "资兴市",
|
||||
"zixingshi": "资兴市",
|
||||
"ziyangqu": "资阳区"
|
||||
},
|
||||
"jiangsu": {
|
||||
"baoyingxian": "宝应县",
|
||||
"binhaixian": "滨海县",
|
||||
"binhuqu": "滨湖区",
|
||||
"changshu": "常熟市",
|
||||
"changshushi": "常熟市",
|
||||
"changzhou": "常州",
|
||||
"changzhoushi": "常州",
|
||||
"chongchuanqu": "崇川区",
|
||||
"dafengqu": "大丰区",
|
||||
"dantuqu": "丹徒区",
|
||||
"danyang": "丹阳市",
|
||||
"danyangshi": "丹阳市",
|
||||
"donghaixian": "东海县",
|
||||
"dongtai": "东台市",
|
||||
"dongtaishi": "东台市",
|
||||
"fengxian": "丰县",
|
||||
"funingxian": "阜宁县",
|
||||
"ganyuqu": "赣榆区",
|
||||
"gaochunqu": "高淳区",
|
||||
"gaogangqu": "高港区",
|
||||
"gaoyou": "高邮市",
|
||||
"gaoyoushi": "高邮市",
|
||||
"guanglingqu": "广陵区",
|
||||
"guannanxian": "灌南县",
|
||||
"guanyunxian": "灌云县",
|
||||
"gulouqu": "鼓楼区",
|
||||
"gusuqu": "姑苏区",
|
||||
"haian": "海安市",
|
||||
"haianshi": "海安市",
|
||||
"hailingqu": "海陵区",
|
||||
"haimenqu": "海门区",
|
||||
"haizhouqu": "海州区",
|
||||
"hanjiangqu": "邗江区",
|
||||
"hongzequ": "洪泽区",
|
||||
"huaian": "淮安",
|
||||
"huaianjingjijishukaifaqu": "淮安经济技术开发区",
|
||||
"huaianqu": "淮安区",
|
||||
"huaianshi": "淮安",
|
||||
"huaiyinqu": "淮阴区",
|
||||
"huishanqu": "惠山区",
|
||||
"huqiuqu": "虎丘区",
|
||||
"jiangduqu": "江都区",
|
||||
"jiangningqu": "江宁区",
|
||||
"jiangyanqu": "姜堰区",
|
||||
"jiangyin": "江阴市",
|
||||
"jiangyinshi": "江阴市",
|
||||
"jianhuxian": "建湖县",
|
||||
"jianyequ": "建邺区",
|
||||
"jiawangqu": "贾汪区",
|
||||
"jingjiang": "靖江市",
|
||||
"jingjiangshi": "靖江市",
|
||||
"jingkouqu": "京口区",
|
||||
"jinhuxian": "金湖县",
|
||||
"jintanqu": "金坛区",
|
||||
"jurong": "句容市",
|
||||
"jurongshi": "句容市",
|
||||
"kunshan": "昆山市",
|
||||
"kunshanshi": "昆山市",
|
||||
"liangxiqu": "梁溪区",
|
||||
"lianshuixian": "涟水县",
|
||||
"lianyungang": "连云港",
|
||||
"lianyunganggaoxinjishuchanyekaifaqu": "连云港高新技术产业开发区",
|
||||
"lianyungangjingjijishukaifaqu": "连云港经济技术开发区",
|
||||
"lianyungangshi": "连云港",
|
||||
"lianyunqu": "连云区",
|
||||
"lishuiqu": "溧水区",
|
||||
"liuhequ": "六合区",
|
||||
"liyang": "溧阳市",
|
||||
"liyangshi": "溧阳市",
|
||||
"nanjing": "南京",
|
||||
"nanjingshi": "南京",
|
||||
"nantong": "南通",
|
||||
"nantongjingjijishukaifaqu": "南通经济技术开发区",
|
||||
"nantongshi": "南通",
|
||||
"peixian": "沛县",
|
||||
"pizhou": "邳州市",
|
||||
"pizhoushi": "邳州市",
|
||||
"pukouqu": "浦口区",
|
||||
"qidong": "启东市",
|
||||
"qidongshi": "启东市",
|
||||
"qingjiangpuqu": "清江浦区",
|
||||
"qinhuaiqu": "秦淮区",
|
||||
"qixiaqu": "栖霞区",
|
||||
"quanshanqu": "泉山区",
|
||||
"rudongxian": "如东县",
|
||||
"rugao": "如皋市",
|
||||
"rugaoshi": "如皋市",
|
||||
"runzhouqu": "润州区",
|
||||
"sheyangxian": "射阳县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shuyangxian": "沭阳县",
|
||||
"sihongxian": "泗洪县",
|
||||
"siyangxian": "泗阳县",
|
||||
"suchengqu": "宿城区",
|
||||
"suiningxian": "睢宁县",
|
||||
"suqian": "宿迁",
|
||||
"suqianjingjijishukaifaqu": "宿迁经济技术开发区",
|
||||
"suqianshi": "宿迁",
|
||||
"suyuqu": "宿豫区",
|
||||
"suzhou": "苏州",
|
||||
"suzhougongyeyuanqu": "苏州工业园区",
|
||||
"suzhoushi": "苏州",
|
||||
"taicang": "太仓市",
|
||||
"taicangshi": "太仓市",
|
||||
"taixing": "泰兴市",
|
||||
"taixingshi": "泰兴市",
|
||||
"taizhou": "泰州",
|
||||
"taizhoushi": "泰州",
|
||||
"taizhouyiyaogaoxinjishuchanyekaifaqu": "泰州医药高新技术产业开发区",
|
||||
"tianningqu": "天宁区",
|
||||
"tinghuqu": "亭湖区",
|
||||
"tongshanqu": "铜山区",
|
||||
"tongzhouqu": "通州区",
|
||||
"wujiangqu": "吴江区",
|
||||
"wujinqu": "武进区",
|
||||
"wuxi": "无锡",
|
||||
"wuxishi": "无锡",
|
||||
"wuzhongqu": "吴中区",
|
||||
"xiangchengqu": "相城区",
|
||||
"xiangshuixian": "响水县",
|
||||
"xinbeiqu": "新北区",
|
||||
"xinghua": "兴化市",
|
||||
"xinghuashi": "兴化市",
|
||||
"xinwuqu": "新吴区",
|
||||
"xinyi": "新沂市",
|
||||
"xinyishi": "新沂市",
|
||||
"xishanqu": "锡山区",
|
||||
"xuanwuqu": "玄武区",
|
||||
"xuyixian": "盱眙县",
|
||||
"xuzhou": "徐州",
|
||||
"xuzhoujingjijishukaifaqu": "徐州经济技术开发区",
|
||||
"xuzhoushi": "徐州",
|
||||
"yancheng": "盐城",
|
||||
"yanchengjingjijishukaifaqu": "盐城经济技术开发区",
|
||||
"yanchengshi": "盐城",
|
||||
"yandouqu": "盐都区",
|
||||
"yangzhong": "扬中市",
|
||||
"yangzhongshi": "扬中市",
|
||||
"yangzhou": "扬州",
|
||||
"yangzhoujingjijishukaifaqu": "扬州经济技术开发区",
|
||||
"yangzhoushi": "扬州",
|
||||
"yixing": "宜兴市",
|
||||
"yixingshi": "宜兴市",
|
||||
"yizheng": "仪征市",
|
||||
"yizhengshi": "仪征市",
|
||||
"yuhuataiqu": "雨花台区",
|
||||
"yunlongqu": "云龙区",
|
||||
"zhangjiagang": "张家港市",
|
||||
"zhangjiagangshi": "张家港市",
|
||||
"zhenjiang": "镇江",
|
||||
"zhenjiangshi": "镇江",
|
||||
"zhenjiangxinqu": "镇江新区",
|
||||
"zhonglouqu": "钟楼区"
|
||||
},
|
||||
"jiangxi": {
|
||||
"anfuxian": "安福县",
|
||||
"anyixian": "安义县",
|
||||
"anyuanqu": "安源区",
|
||||
"anyuanxian": "安远县",
|
||||
"chaisangqu": "柴桑区",
|
||||
"changjiangqu": "昌江区",
|
||||
"chongrenxian": "崇仁县",
|
||||
"chongyixian": "崇义县",
|
||||
"dayuxian": "大余县",
|
||||
"deanxian": "德安县",
|
||||
"dexing": "德兴市",
|
||||
"dexingshi": "德兴市",
|
||||
"dingnanxian": "定南县",
|
||||
"donghuqu": "东湖区",
|
||||
"dongxiangqu": "东乡区",
|
||||
"douchangxian": "都昌县",
|
||||
"fengcheng": "丰城市",
|
||||
"fengchengshi": "丰城市",
|
||||
"fengxinxian": "奉新县",
|
||||
"fenyixian": "分宜县",
|
||||
"fuliangxian": "浮梁县",
|
||||
"fuzhou": "抚州",
|
||||
"fuzhoushi": "抚州",
|
||||
"ganxianqu": "赣县区",
|
||||
"ganzhou": "赣州",
|
||||
"ganzhoushi": "赣州",
|
||||
"gaoan": "高安市",
|
||||
"gaoanshi": "高安市",
|
||||
"gongqingcheng": "共青城市",
|
||||
"gongqingchengshi": "共青城市",
|
||||
"guangchangxian": "广昌县",
|
||||
"guangfengqu": "广丰区",
|
||||
"guangxinqu": "广信区",
|
||||
"guixi": "贵溪市",
|
||||
"guixishi": "贵溪市",
|
||||
"hengfengxian": "横峰县",
|
||||
"honggutanqu": "红谷滩区",
|
||||
"huichangxian": "会昌县",
|
||||
"hukouxian": "湖口县",
|
||||
"jian": "吉安",
|
||||
"jianshi": "吉安",
|
||||
"jianxian": "吉安县",
|
||||
"jinganxian": "靖安县",
|
||||
"jingdezhen": "景德镇",
|
||||
"jingdezhenshi": "景德镇",
|
||||
"jinggangshan": "井冈山市",
|
||||
"jinggangshanshi": "井冈山市",
|
||||
"jinxianxian": "进贤县",
|
||||
"jinxixian": "金溪县",
|
||||
"jishuixian": "吉水县",
|
||||
"jiujiang": "九江",
|
||||
"jiujiangshi": "九江",
|
||||
"jizhouqu": "吉州区",
|
||||
"leanxian": "乐安县",
|
||||
"leping": "乐平市",
|
||||
"lepingshi": "乐平市",
|
||||
"lianhuaxian": "莲花县",
|
||||
"lianxiqu": "濂溪区",
|
||||
"lichuanxian": "黎川县",
|
||||
"linchuanqu": "临川区",
|
||||
"longnan": "龙南市",
|
||||
"longnanshi": "龙南市",
|
||||
"lushan": "庐山市",
|
||||
"lushanshi": "庐山市",
|
||||
"luxixian": "芦溪县",
|
||||
"nanchang": "南昌",
|
||||
"nanchangshi": "南昌",
|
||||
"nanchangxian": "南昌县",
|
||||
"nanchengxian": "南城县",
|
||||
"nanfengxian": "南丰县",
|
||||
"nankangqu": "南康区",
|
||||
"ningdouxian": "宁都县",
|
||||
"pengzexian": "彭泽县",
|
||||
"pingxiang": "萍乡",
|
||||
"pingxiangshi": "萍乡",
|
||||
"poyangxian": "鄱阳县",
|
||||
"qingshanhuqu": "青山湖区",
|
||||
"qingyuanqu": "青原区",
|
||||
"qingyunpuqu": "青云谱区",
|
||||
"quannanxian": "全南县",
|
||||
"ruichang": "瑞昌市",
|
||||
"ruichangshi": "瑞昌市",
|
||||
"ruijin": "瑞金市",
|
||||
"ruijinshi": "瑞金市",
|
||||
"shanggaoxian": "上高县",
|
||||
"shanglixian": "上栗县",
|
||||
"shangrao": "上饶",
|
||||
"shangraoshi": "上饶",
|
||||
"shangyouxian": "上犹县",
|
||||
"shichengxian": "石城县",
|
||||
"shixiaqu": "市辖区",
|
||||
"suichuanxian": "遂川县",
|
||||
"taihexian": "泰和县",
|
||||
"tongguxian": "铜鼓县",
|
||||
"wananxian": "万安县",
|
||||
"wannianxian": "万年县",
|
||||
"wanzaixian": "万载县",
|
||||
"wuningxian": "武宁县",
|
||||
"wuyuanxian": "婺源县",
|
||||
"xiajiangxian": "峡江县",
|
||||
"xiangdongqu": "湘东区",
|
||||
"xihuqu": "西湖区",
|
||||
"xinfengxian": "信丰县",
|
||||
"xinganxian": "新干县",
|
||||
"xingguoxian": "兴国县",
|
||||
"xinjianqu": "新建区",
|
||||
"xinyu": "新余",
|
||||
"xinyushi": "新余",
|
||||
"xinzhouqu": "信州区",
|
||||
"xiushuixian": "修水县",
|
||||
"xunwuxian": "寻乌县",
|
||||
"xunyangqu": "浔阳区",
|
||||
"yanshanxian": "铅山县",
|
||||
"yichun": "宜春",
|
||||
"yichunshi": "宜春",
|
||||
"yifengxian": "宜丰县",
|
||||
"yihuangxian": "宜黄县",
|
||||
"yingtan": "鹰潭",
|
||||
"yingtanshi": "鹰潭",
|
||||
"yiyangxian": "弋阳县",
|
||||
"yongfengxian": "永丰县",
|
||||
"yongxinxian": "永新县",
|
||||
"yongxiuxian": "永修县",
|
||||
"yuanzhouqu": "袁州区",
|
||||
"yudouxian": "于都县",
|
||||
"yuehuqu": "月湖区",
|
||||
"yuganxian": "余干县",
|
||||
"yujiangqu": "余江区",
|
||||
"yushanxian": "玉山县",
|
||||
"yushuiqu": "渝水区",
|
||||
"zhanggongqu": "章贡区",
|
||||
"zhangshu": "樟树市",
|
||||
"zhangshushi": "樟树市",
|
||||
"zhushanqu": "珠山区",
|
||||
"zixixian": "资溪县"
|
||||
},
|
||||
"jilin": {
|
||||
"antuxian": "安图县",
|
||||
"baicheng": "白城",
|
||||
"baichengshi": "白城",
|
||||
"baishan": "白山",
|
||||
"baishanshi": "白山",
|
||||
"changchun": "长春",
|
||||
"changchungaoxinjishuchanyekaifaqu": "长春高新技术产业开发区",
|
||||
"changchunjingjijishukaifaqu": "长春经济技术开发区",
|
||||
"changchunjingyuegaoxinjishuchanyekaifaqu": "长春净月高新技术产业开发区",
|
||||
"changchunqichejingjijishukaifaqu": "长春汽车经济技术开发区",
|
||||
"changchunshi": "长春",
|
||||
"changyiqu": "昌邑区",
|
||||
"chaoyangqu": "朝阳区",
|
||||
"chuanyingqu": "船营区",
|
||||
"daan": "大安市",
|
||||
"daanshi": "大安市",
|
||||
"dehui": "德惠市",
|
||||
"dehuishi": "德惠市",
|
||||
"dongchangqu": "东昌区",
|
||||
"dongfengxian": "东丰县",
|
||||
"dongliaoxian": "东辽县",
|
||||
"dunhua": "敦化市",
|
||||
"dunhuashi": "敦化市",
|
||||
"erdaojiangqu": "二道江区",
|
||||
"erdaoqu": "二道区",
|
||||
"fengmanqu": "丰满区",
|
||||
"fusongxian": "抚松县",
|
||||
"fuyu": "扶余市",
|
||||
"fuyushi": "扶余市",
|
||||
"gongzhuling": "公主岭市",
|
||||
"gongzhulingshi": "公主岭市",
|
||||
"helong": "和龙市",
|
||||
"helongshi": "和龙市",
|
||||
"huadian": "桦甸市",
|
||||
"huadianshi": "桦甸市",
|
||||
"huichun": "珲春市",
|
||||
"huichunshi": "珲春市",
|
||||
"huinanxian": "辉南县",
|
||||
"hunjiangqu": "浑江区",
|
||||
"jian": "集安市",
|
||||
"jiangyuanqu": "江源区",
|
||||
"jianshi": "集安市",
|
||||
"jiaohe": "蛟河市",
|
||||
"jiaoheshi": "蛟河市",
|
||||
"jilin": "吉林",
|
||||
"jilinbaichengjingjikaifaqu": "吉林白城经济开发区",
|
||||
"jilingaoxinjishuchanyekaifaqu": "吉林高新技术产业开发区",
|
||||
"jilinjingjikaifaqu": "吉林经济开发区",
|
||||
"jilinshi": "吉林",
|
||||
"jilinsongyuanjingjikaifaqu": "吉林松原经济开发区",
|
||||
"jilinzhongguoxinjiaposhipinqu": "吉林中国新加坡食品区",
|
||||
"jingyuxian": "靖宇县",
|
||||
"jiutaiqu": "九台区",
|
||||
"kuanchengqu": "宽城区",
|
||||
"liaoyuan": "辽源",
|
||||
"liaoyuanshi": "辽源",
|
||||
"linjiang": "临江市",
|
||||
"linjiangshi": "临江市",
|
||||
"lishuxian": "梨树县",
|
||||
"liuhexian": "柳河县",
|
||||
"longjing": "龙井市",
|
||||
"longjingshi": "龙井市",
|
||||
"longshanqu": "龙山区",
|
||||
"longtanqu": "龙潭区",
|
||||
"lvyuanqu": "绿园区",
|
||||
"meihekou": "梅河口市",
|
||||
"meihekoushi": "梅河口市",
|
||||
"nanguanqu": "南关区",
|
||||
"ningjiangqu": "宁江区",
|
||||
"nonganxian": "农安县",
|
||||
"panshi": "磐石市",
|
||||
"panshishi": "磐石市",
|
||||
"qiananxian": "乾安县",
|
||||
"qianguoerluosimengguzuzizhixian": "前郭尔罗斯蒙古族自治县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shuangliao": "双辽市",
|
||||
"shuangliaoshi": "双辽市",
|
||||
"shuangyangqu": "双阳区",
|
||||
"shulan": "舒兰市",
|
||||
"shulanshi": "舒兰市",
|
||||
"siping": "四平",
|
||||
"sipingshi": "四平",
|
||||
"songyuan": "松原",
|
||||
"songyuanshi": "松原",
|
||||
"taobeiqu": "洮北区",
|
||||
"taonan": "洮南市",
|
||||
"taonanshi": "洮南市",
|
||||
"tiedongqu": "铁东区",
|
||||
"tiexiqu": "铁西区",
|
||||
"tonghua": "通化",
|
||||
"tonghuashi": "通化",
|
||||
"tonghuaxian": "通化县",
|
||||
"tongyuxian": "通榆县",
|
||||
"tumen": "图们市",
|
||||
"tumenshi": "图们市",
|
||||
"wangqingxian": "汪清县",
|
||||
"xianqu": "西安区",
|
||||
"yanbianchaoxianzu": "延边朝鲜族",
|
||||
"yanbianchaoxianzuzizhizhou": "延边朝鲜族",
|
||||
"yanji": "延吉市",
|
||||
"yanjishi": "延吉市",
|
||||
"yitongmanzuzizhixian": "伊通满族自治县",
|
||||
"yongjixian": "永吉县",
|
||||
"yushu": "榆树市",
|
||||
"yushushi": "榆树市",
|
||||
"zhangbaichaoxianzuzizhixian": "长白朝鲜族自治县",
|
||||
"zhanglingxian": "长岭县",
|
||||
"zhenlaixian": "镇赉县"
|
||||
},
|
||||
"liaoning": {
|
||||
"anshan": "鞍山",
|
||||
"anshanshi": "鞍山",
|
||||
"baitaqu": "白塔区",
|
||||
"bayuquanqu": "鲅鱼圈区",
|
||||
"beipiao": "北票市",
|
||||
"beipiaoshi": "北票市",
|
||||
"beizhen": "北镇市",
|
||||
"beizhenshi": "北镇市",
|
||||
"benxi": "本溪",
|
||||
"benximanzuzizhixian": "本溪满族自治县",
|
||||
"benxishi": "本溪",
|
||||
"changtuxian": "昌图县",
|
||||
"dadongqu": "大东区",
|
||||
"dalian": "大连",
|
||||
"dalianshi": "大连",
|
||||
"dandong": "丹东",
|
||||
"dandongshi": "丹东",
|
||||
"dashiqiao": "大石桥市",
|
||||
"dashiqiaoshi": "大石桥市",
|
||||
"dawaqu": "大洼区",
|
||||
"dengta": "灯塔市",
|
||||
"dengtashi": "灯塔市",
|
||||
"diaobingshan": "调兵山市",
|
||||
"diaobingshanshi": "调兵山市",
|
||||
"donggang": "东港市",
|
||||
"donggangshi": "东港市",
|
||||
"dongzhouqu": "东洲区",
|
||||
"fakuxian": "法库县",
|
||||
"fengcheng": "凤城市",
|
||||
"fengchengshi": "凤城市",
|
||||
"fushun": "抚顺",
|
||||
"fushunshi": "抚顺",
|
||||
"fushunxian": "抚顺县",
|
||||
"fuxin": "阜新",
|
||||
"fuxinmengguzuzizhixian": "阜新蒙古族自治县",
|
||||
"fuxinshi": "阜新",
|
||||
"gaizhou": "盖州市",
|
||||
"gaizhoushi": "盖州市",
|
||||
"ganjingziqu": "甘井子区",
|
||||
"gongzhanglingqu": "弓长岭区",
|
||||
"gutaqu": "古塔区",
|
||||
"haicheng": "海城市",
|
||||
"haichengshi": "海城市",
|
||||
"haizhouqu": "海州区",
|
||||
"heishanxian": "黑山县",
|
||||
"hepingqu": "和平区",
|
||||
"hongweiqu": "宏伟区",
|
||||
"huangguqu": "皇姑区",
|
||||
"huanrenmanzuzizhixian": "桓仁满族自治县",
|
||||
"huludao": "葫芦岛",
|
||||
"huludaoshi": "葫芦岛",
|
||||
"hunnanqu": "浑南区",
|
||||
"jianchangxian": "建昌县",
|
||||
"jianpingxian": "建平县",
|
||||
"jinzhou": "锦州",
|
||||
"jinzhouqu": "金州区",
|
||||
"jinzhoushi": "锦州",
|
||||
"kaiyuan": "开原市",
|
||||
"kaiyuanshi": "开原市",
|
||||
"kalaqinzuoyimengguzuzizhixian": "喀喇沁左翼蒙古族自治县",
|
||||
"kangpingxian": "康平县",
|
||||
"kuandianmanzuzizhixian": "宽甸满族自治县",
|
||||
"laobianqu": "老边区",
|
||||
"lianshanqu": "连山区",
|
||||
"liaoyang": "辽阳",
|
||||
"liaoyangshi": "辽阳",
|
||||
"liaoyangxian": "辽阳县",
|
||||
"liaozhongqu": "辽中区",
|
||||
"linghai": "凌海市",
|
||||
"linghaishi": "凌海市",
|
||||
"linghequ": "凌河区",
|
||||
"lingyuan": "凌源市",
|
||||
"lingyuanshi": "凌源市",
|
||||
"lishanqu": "立山区",
|
||||
"longchengqu": "龙城区",
|
||||
"longgangqu": "龙港区",
|
||||
"lvshunkouqu": "旅顺口区",
|
||||
"mingshanqu": "明山区",
|
||||
"nanfenqu": "南芬区",
|
||||
"nanpiaoqu": "南票区",
|
||||
"panjin": "盘锦",
|
||||
"panjinshi": "盘锦",
|
||||
"panshanxian": "盘山县",
|
||||
"pingshanqu": "平山区",
|
||||
"pulandianqu": "普兰店区",
|
||||
"qianshanqu": "千山区",
|
||||
"qinghemenqu": "清河门区",
|
||||
"qinghequ": "清河区",
|
||||
"qingyuanmanzuzizhixian": "清原满族自治县",
|
||||
"shahekouqu": "沙河口区",
|
||||
"shenbeixinqu": "沈北新区",
|
||||
"shenhequ": "沈河区",
|
||||
"shenyang": "沈阳",
|
||||
"shenyangshi": "沈阳",
|
||||
"shixiaqu": "市辖区",
|
||||
"shuangtaiziqu": "双台子区",
|
||||
"shuangtaqu": "双塔区",
|
||||
"shunchengqu": "顺城区",
|
||||
"suizhongxian": "绥中县",
|
||||
"sujiatunqu": "苏家屯区",
|
||||
"taianxian": "台安县",
|
||||
"taihequ": "太和区",
|
||||
"taipingqu": "太平区",
|
||||
"taizihequ": "太子河区",
|
||||
"tiedongqu": "铁东区",
|
||||
"tieling": "铁岭",
|
||||
"tielingshi": "铁岭",
|
||||
"tielingxian": "铁岭县",
|
||||
"tiexiqu": "铁西区",
|
||||
"wafangdian": "瓦房店市",
|
||||
"wafangdianshi": "瓦房店市",
|
||||
"wanghuaqu": "望花区",
|
||||
"wenshengqu": "文圣区",
|
||||
"xifengxian": "西丰县",
|
||||
"xigangqu": "西岗区",
|
||||
"xihequ": "细河区",
|
||||
"xihuqu": "溪湖区",
|
||||
"xinbinmanzuzizhixian": "新宾满族自治县",
|
||||
"xinfuqu": "新抚区",
|
||||
"xingcheng": "兴城市",
|
||||
"xingchengshi": "兴城市",
|
||||
"xinglongtaiqu": "兴隆台区",
|
||||
"xinmin": "新民市",
|
||||
"xinminshi": "新民市",
|
||||
"xinqiuqu": "新邱区",
|
||||
"xishiqu": "西市区",
|
||||
"xiuyanmanzuzizhixian": "岫岩满族自治县",
|
||||
"yingkou": "营口",
|
||||
"yingkoushi": "营口",
|
||||
"yinzhouqu": "银州区",
|
||||
"yixian": "义县",
|
||||
"yuanbaoqu": "元宝区",
|
||||
"yuhongqu": "于洪区",
|
||||
"zhanghaixian": "长海县",
|
||||
"zhangwuxian": "彰武县",
|
||||
"zhanqianqu": "站前区",
|
||||
"zhaoyang": "朝阳",
|
||||
"zhaoyangshi": "朝阳",
|
||||
"zhaoyangxian": "朝阳县",
|
||||
"zhenanqu": "振安区",
|
||||
"zhenxingqu": "振兴区",
|
||||
"zhongshanqu": "中山区",
|
||||
"zhuanghe": "庄河市",
|
||||
"zhuangheshi": "庄河市"
|
||||
},
|
||||
"neimenggu": {
|
||||
"abagaqi": "阿巴嘎旗",
|
||||
"aershan": "阿尔山市",
|
||||
"aershanshi": "阿尔山市",
|
||||
"alashan": "阿拉善",
|
||||
"alashanmeng": "阿拉善",
|
||||
"alashanyouqi": "阿拉善右旗",
|
||||
"alashanzuoqi": "阿拉善左旗",
|
||||
"alukeerqinqi": "阿鲁科尔沁旗",
|
||||
"aohanqi": "敖汉旗",
|
||||
"arongqi": "阿荣旗",
|
||||
"baiyunebokuangqu": "白云鄂博矿区",
|
||||
"balinyouqi": "巴林右旗",
|
||||
"balinzuoqi": "巴林左旗",
|
||||
"baotou": "包头",
|
||||
"baotoushi": "包头",
|
||||
"baotouxitugaoxinjishuchanyekaifaqu": "包头稀土高新技术产业开发区",
|
||||
"bayannaoer": "巴彦淖尔",
|
||||
"bayannaoershi": "巴彦淖尔",
|
||||
"chahaeryouyihouqi": "察哈尔右翼后旗",
|
||||
"chahaeryouyiqianqi": "察哈尔右翼前旗",
|
||||
"chahaeryouyizhongqi": "察哈尔右翼中旗",
|
||||
"chenbaerhuqi": "陈巴尔虎旗",
|
||||
"chifeng": "赤峰",
|
||||
"chifengshi": "赤峰",
|
||||
"daerhanmaominganlianheqi": "达尔罕茂明安联合旗",
|
||||
"dalateqi": "达拉特旗",
|
||||
"dengkouxian": "磴口县",
|
||||
"donghequ": "东河区",
|
||||
"dongshengqu": "东胜区",
|
||||
"dongwuzhumuqinqi": "东乌珠穆沁旗",
|
||||
"duolunxian": "多伦县",
|
||||
"eerduosi": "鄂尔多斯",
|
||||
"eerduosishi": "鄂尔多斯",
|
||||
"eerguna": "额尔古纳市",
|
||||
"eergunashi": "额尔古纳市",
|
||||
"ejinaqi": "额济纳旗",
|
||||
"elunchunzizhiqi": "鄂伦春自治旗",
|
||||
"erlianhaote": "二连浩特市",
|
||||
"erlianhaoteshi": "二连浩特市",
|
||||
"etuokeqi": "鄂托克旗",
|
||||
"etuokeqianqi": "鄂托克前旗",
|
||||
"ewenkezuzizhiqi": "鄂温克族自治旗",
|
||||
"fengzhen": "丰镇市",
|
||||
"fengzhenshi": "丰镇市",
|
||||
"genhe": "根河市",
|
||||
"genheshi": "根河市",
|
||||
"guyangxian": "固阳县",
|
||||
"haibowanqu": "海勃湾区",
|
||||
"hailaerqu": "海拉尔区",
|
||||
"hainanqu": "海南区",
|
||||
"hangjinhouqi": "杭锦后旗",
|
||||
"hangjinqi": "杭锦旗",
|
||||
"helingeerxian": "和林格尔县",
|
||||
"hongshanqu": "红山区",
|
||||
"huadexian": "化德县",
|
||||
"huhehaote": "呼和浩特",
|
||||
"huhehaotejingjijishukaifaqu": "呼和浩特经济技术开发区",
|
||||
"huhehaoteshi": "呼和浩特",
|
||||
"huiminqu": "回民区",
|
||||
"hulunbeier": "呼伦贝尔",
|
||||
"hulunbeiershi": "呼伦贝尔",
|
||||
"huolinguolei": "霍林郭勒市",
|
||||
"huolinguoleishi": "霍林郭勒市",
|
||||
"jiningqu": "集宁区",
|
||||
"jiuyuanqu": "九原区",
|
||||
"kailuxian": "开鲁县",
|
||||
"kalaqinqi": "喀喇沁旗",
|
||||
"kangbashenqu": "康巴什区",
|
||||
"keerqinqu": "科尔沁区",
|
||||
"keerqinyouyiqianqi": "科尔沁右翼前旗",
|
||||
"keerqinyouyizhongqi": "科尔沁右翼中旗",
|
||||
"keerqinzuoyihouqi": "科尔沁左翼后旗",
|
||||
"keerqinzuoyizhongqi": "科尔沁左翼中旗",
|
||||
"keshenketengqi": "克什克腾旗",
|
||||
"kulunqi": "库伦旗",
|
||||
"kundoulunqu": "昆都仑区",
|
||||
"liangchengxian": "凉城县",
|
||||
"linhequ": "临河区",
|
||||
"linxixian": "林西县",
|
||||
"manzhouli": "满洲里市",
|
||||
"manzhoulishi": "满洲里市",
|
||||
"molidawadawoerzuzizhiqi": "莫力达瓦达斡尔族自治旗",
|
||||
"naimanqi": "奈曼旗",
|
||||
"neimenggualashangaoxinjishuchanyekaifaqu": "内蒙古阿拉善高新技术产业开发区",
|
||||
"ningchengxian": "宁城县",
|
||||
"qingshanqu": "青山区",
|
||||
"qingshuihexian": "清水河县",
|
||||
"saihanqu": "赛罕区",
|
||||
"shangdouxian": "商都县",
|
||||
"shiguaiqu": "石拐区",
|
||||
"shixiaqu": "市辖区",
|
||||
"siziwangqi": "四子王旗",
|
||||
"songshanqu": "松山区",
|
||||
"suniteyouqi": "苏尼特右旗",
|
||||
"sunitezuoqi": "苏尼特左旗",
|
||||
"taipusiqi": "太仆寺旗",
|
||||
"tongliao": "通辽",
|
||||
"tongliaojingjijishukaifaqu": "通辽经济技术开发区",
|
||||
"tongliaoshi": "通辽",
|
||||
"tumoteyouqi": "土默特右旗",
|
||||
"tumotezuoqi": "土默特左旗",
|
||||
"tuoketuoxian": "托克托县",
|
||||
"tuquanxian": "突泉县",
|
||||
"wengniuteqi": "翁牛特旗",
|
||||
"wuchuanxian": "武川县",
|
||||
"wudaqu": "乌达区",
|
||||
"wuhai": "乌海",
|
||||
"wuhaishi": "乌海",
|
||||
"wulagaiguanweihui": "乌拉盖管委会",
|
||||
"wulanchabu": "乌兰察布",
|
||||
"wulanchabushi": "乌兰察布",
|
||||
"wulanhaote": "乌兰浩特市",
|
||||
"wulanhaoteshi": "乌兰浩特市",
|
||||
"wulatehouqi": "乌拉特后旗",
|
||||
"wulateqianqi": "乌拉特前旗",
|
||||
"wulatezhongqi": "乌拉特中旗",
|
||||
"wushenqi": "乌审旗",
|
||||
"wuyuanxian": "五原县",
|
||||
"xianghuangqi": "镶黄旗",
|
||||
"xilinguolei": "锡林郭勒",
|
||||
"xilinguoleimeng": "锡林郭勒",
|
||||
"xilinhaote": "锡林浩特市",
|
||||
"xilinhaoteshi": "锡林浩特市",
|
||||
"xinbaerhuyouqi": "新巴尔虎右旗",
|
||||
"xinbaerhuzuoqi": "新巴尔虎左旗",
|
||||
"xinchengqu": "新城区",
|
||||
"xingan": "兴安",
|
||||
"xinganmeng": "兴安",
|
||||
"xinghexian": "兴和县",
|
||||
"xiwuzhumuqinqi": "西乌珠穆沁旗",
|
||||
"yakeshi": "牙克石市",
|
||||
"yakeshishi": "牙克石市",
|
||||
"yijinhuoluoqi": "伊金霍洛旗",
|
||||
"yuanbaoshanqu": "元宝山区",
|
||||
"yuquanqu": "玉泉区",
|
||||
"zhalainuoerqu": "扎赉诺尔区",
|
||||
"zhalaiteqi": "扎赉特旗",
|
||||
"zhalantun": "扎兰屯市",
|
||||
"zhalantunshi": "扎兰屯市",
|
||||
"zhaluteqi": "扎鲁特旗",
|
||||
"zhenglanqi": "正蓝旗",
|
||||
"zhengxiangbaiqi": "正镶白旗",
|
||||
"zhungeerqi": "准格尔旗",
|
||||
"zhuozixian": "卓资县"
|
||||
},
|
||||
"ningxia": {
|
||||
"dawukouqu": "大武口区",
|
||||
"guyuan": "固原",
|
||||
"guyuanshi": "固原",
|
||||
"haiyuanxian": "海原县",
|
||||
"helanxian": "贺兰县",
|
||||
"hongsibaoqu": "红寺堡区",
|
||||
"huinongqu": "惠农区",
|
||||
"jinfengqu": "金凤区",
|
||||
"jingyuanxian": "泾源县",
|
||||
"lingwu": "灵武市",
|
||||
"lingwushi": "灵武市",
|
||||
"litongqu": "利通区",
|
||||
"longdexian": "隆德县",
|
||||
"pengyangxian": "彭阳县",
|
||||
"pingluoxian": "平罗县",
|
||||
"qingtongxia": "青铜峡市",
|
||||
"qingtongxiashi": "青铜峡市",
|
||||
"shapotouqu": "沙坡头区",
|
||||
"shixiaqu": "市辖区",
|
||||
"shizuishan": "石嘴山",
|
||||
"shizuishanshi": "石嘴山",
|
||||
"tongxinxian": "同心县",
|
||||
"wuzhong": "吴忠",
|
||||
"wuzhongshi": "吴忠",
|
||||
"xijixian": "西吉县",
|
||||
"xingqingqu": "兴庆区",
|
||||
"xixiaqu": "西夏区",
|
||||
"yanchixian": "盐池县",
|
||||
"yinchuan": "银川",
|
||||
"yinchuanshi": "银川",
|
||||
"yongningxian": "永宁县",
|
||||
"yuanzhouqu": "原州区",
|
||||
"zhongningxian": "中宁县",
|
||||
"zhongwei": "中卫",
|
||||
"zhongweishi": "中卫"
|
||||
},
|
||||
"qinghai": {
|
||||
"banmaxian": "班玛县",
|
||||
"chengbeiqu": "城北区",
|
||||
"chengdongqu": "城东区",
|
||||
"chengduoxian": "称多县",
|
||||
"chengxiqu": "城西区",
|
||||
"chengzhongqu": "城中区",
|
||||
"dachaidanxingzhengweiyuanhui": "大柴旦行政委员会",
|
||||
"darixian": "达日县",
|
||||
"datonghuizutuzuzizhixian": "大通回族土族自治县",
|
||||
"delingha": "德令哈市",
|
||||
"delinghashi": "德令哈市",
|
||||
"doulanxian": "都兰县",
|
||||
"gandexian": "甘德县",
|
||||
"gangchaxian": "刚察县",
|
||||
"geermu": "格尔木市",
|
||||
"geermushi": "格尔木市",
|
||||
"gonghexian": "共和县",
|
||||
"guidexian": "贵德县",
|
||||
"guinanxian": "贵南县",
|
||||
"guoluozangzu": "果洛藏族",
|
||||
"guoluozangzuzizhizhou": "果洛藏族",
|
||||
"haibeizangzu": "海北藏族",
|
||||
"haibeizangzuzizhizhou": "海北藏族",
|
||||
"haidong": "海东",
|
||||
"haidongshi": "海东",
|
||||
"hainanzangzu": "海南藏族",
|
||||
"hainanzangzuzizhizhou": "海南藏族",
|
||||
"haiximengguzuzangzu": "海西蒙古族藏族",
|
||||
"haiximengguzuzangzuzizhizhou": "海西蒙古族藏族",
|
||||
"haiyanxian": "海晏县",
|
||||
"henanmengguzuzizhixian": "河南蒙古族自治县",
|
||||
"hualonghuizuzizhixian": "化隆回族自治县",
|
||||
"huangnanzangzu": "黄南藏族",
|
||||
"huangnanzangzuzizhizhou": "黄南藏族",
|
||||
"huangyuanxian": "湟源县",
|
||||
"huangzhongqu": "湟中区",
|
||||
"huzhutuzuzizhixian": "互助土族自治县",
|
||||
"jianzhaxian": "尖扎县",
|
||||
"jiuzhixian": "久治县",
|
||||
"leduqu": "乐都区",
|
||||
"maduoxian": "玛多县",
|
||||
"mangya": "茫崖市",
|
||||
"mangyashi": "茫崖市",
|
||||
"maqinxian": "玛沁县",
|
||||
"menyuanhuizuzizhixian": "门源回族自治县",
|
||||
"minhehuizutuzuzizhixian": "民和回族土族自治县",
|
||||
"nangqianxian": "囊谦县",
|
||||
"pinganqu": "平安区",
|
||||
"qilianxian": "祁连县",
|
||||
"qumalaixian": "曲麻莱县",
|
||||
"shixiaqu": "市辖区",
|
||||
"tianjunxian": "天峻县",
|
||||
"tongdexian": "同德县",
|
||||
"tongren": "同仁市",
|
||||
"tongrenshi": "同仁市",
|
||||
"wulanxian": "乌兰县",
|
||||
"xinghaixian": "兴海县",
|
||||
"xining": "西宁",
|
||||
"xiningshi": "西宁",
|
||||
"xunhuasalazuzizhixian": "循化撒拉族自治县",
|
||||
"yushu": "玉树市",
|
||||
"yushushi": "玉树市",
|
||||
"yushuzangzu": "玉树藏族",
|
||||
"yushuzangzuzizhizhou": "玉树藏族",
|
||||
"zaduoxian": "杂多县",
|
||||
"zekuxian": "泽库县",
|
||||
"zhiduoxian": "治多县"
|
||||
},
|
||||
"shandong": {
|
||||
"anqiu": "安丘市",
|
||||
"anqiushi": "安丘市",
|
||||
"binchengqu": "滨城区",
|
||||
"binzhou": "滨州",
|
||||
"binzhoushi": "滨州",
|
||||
"boshanqu": "博山区",
|
||||
"boxingxian": "博兴县",
|
||||
"caoxian": "曹县",
|
||||
"changlexian": "昌乐县",
|
||||
"changyi": "昌邑市",
|
||||
"changyishi": "昌邑市",
|
||||
"chengwuxian": "成武县",
|
||||
"chengyangqu": "城阳区",
|
||||
"chipingqu": "茌平区",
|
||||
"daiyuequ": "岱岳区",
|
||||
"danxian": "单县",
|
||||
"dechengqu": "德城区",
|
||||
"dezhou": "德州",
|
||||
"dezhoujingjijishukaifaqu": "德州经济技术开发区",
|
||||
"dezhoushi": "德州",
|
||||
"dezhouyunhejingjikaifaqu": "德州运河经济开发区",
|
||||
"dingtaoqu": "定陶区",
|
||||
"dongchangfuqu": "东昌府区",
|
||||
"dongexian": "东阿县",
|
||||
"donggangqu": "东港区",
|
||||
"dongmingxian": "东明县",
|
||||
"dongpingxian": "东平县",
|
||||
"dongying": "东营",
|
||||
"dongyinggangjingjikaifaqu": "东营港经济开发区",
|
||||
"dongyingjingjijishukaifaqu": "东营经济技术开发区",
|
||||
"dongyingqu": "东营区",
|
||||
"dongyingshi": "东营",
|
||||
"fangziqu": "坊子区",
|
||||
"feicheng": "肥城市",
|
||||
"feichengshi": "肥城市",
|
||||
"feixian": "费县",
|
||||
"fushanqu": "福山区",
|
||||
"gangchengqu": "钢城区",
|
||||
"gaomi": "高密市",
|
||||
"gaomishi": "高密市",
|
||||
"gaoqingxian": "高青县",
|
||||
"gaotangxian": "高唐县",
|
||||
"guangraoxian": "广饶县",
|
||||
"guanxian": "冠县",
|
||||
"haiyang": "海阳市",
|
||||
"haiyangshi": "海阳市",
|
||||
"hantingqu": "寒亭区",
|
||||
"hedongqu": "河东区",
|
||||
"hekouqu": "河口区",
|
||||
"heze": "菏泽",
|
||||
"hezegaoxinjishukaifaqu": "菏泽高新技术开发区",
|
||||
"hezejingjijishukaifaqu": "菏泽经济技术开发区",
|
||||
"hezeshi": "菏泽",
|
||||
"huaiyinqu": "槐荫区",
|
||||
"huancuiqu": "环翠区",
|
||||
"huangdaoqu": "黄岛区",
|
||||
"huantaixian": "桓台县",
|
||||
"huiminxian": "惠民县",
|
||||
"jiaozhou": "胶州市",
|
||||
"jiaozhoushi": "胶州市",
|
||||
"jiaxiangxian": "嘉祥县",
|
||||
"jimoqu": "即墨区",
|
||||
"jinan": "济南",
|
||||
"jinangaoxinjishuchanyekaifaqu": "济南高新技术产业开发区",
|
||||
"jinanshi": "济南",
|
||||
"jining": "济宁",
|
||||
"jininggaoxinjishuchanyekaifaqu": "济宁高新技术产业开发区",
|
||||
"jiningshi": "济宁",
|
||||
"jinxiangxian": "金乡县",
|
||||
"jiyangqu": "济阳区",
|
||||
"juanchengxian": "鄄城县",
|
||||
"junanxian": "莒南县",
|
||||
"juxian": "莒县",
|
||||
"juyexian": "巨野县",
|
||||
"kenliqu": "垦利区",
|
||||
"kuiwenqu": "奎文区",
|
||||
"laishanqu": "莱山区",
|
||||
"laiwuqu": "莱芜区",
|
||||
"laixi": "莱西市",
|
||||
"laixishi": "莱西市",
|
||||
"laiyang": "莱阳市",
|
||||
"laiyangshi": "莱阳市",
|
||||
"laizhou": "莱州市",
|
||||
"laizhoushi": "莱州市",
|
||||
"lanlingxian": "兰陵县",
|
||||
"lanshanqu": "岚山区",
|
||||
"laoshanqu": "崂山区",
|
||||
"leling": "乐陵市",
|
||||
"lelingshi": "乐陵市",
|
||||
"liangshanxian": "梁山县",
|
||||
"liaocheng": "聊城",
|
||||
"liaochengshi": "聊城",
|
||||
"licangqu": "李沧区",
|
||||
"lichengqu": "历城区",
|
||||
"lijinxian": "利津县",
|
||||
"lingchengqu": "陵城区",
|
||||
"linqing": "临清市",
|
||||
"linqingshi": "临清市",
|
||||
"linquxian": "临朐县",
|
||||
"linshuxian": "临沭县",
|
||||
"linyi": "临沂",
|
||||
"linyigaoxinjishuchanyekaifaqu": "临沂高新技术产业开发区",
|
||||
"linyishi": "临沂",
|
||||
"linyixian": "临邑县",
|
||||
"linziqu": "临淄区",
|
||||
"lixiaqu": "历下区",
|
||||
"longkou": "龙口市",
|
||||
"longkoushi": "龙口市",
|
||||
"luozhuangqu": "罗庄区",
|
||||
"mengyinxian": "蒙阴县",
|
||||
"mudanqu": "牡丹区",
|
||||
"mupingqu": "牟平区",
|
||||
"ningjinxian": "宁津县",
|
||||
"ningyangxian": "宁阳县",
|
||||
"penglaiqu": "蓬莱区",
|
||||
"pingdu": "平度市",
|
||||
"pingdushi": "平度市",
|
||||
"pingyinxian": "平阴县",
|
||||
"pingyixian": "平邑县",
|
||||
"pingyuanxian": "平原县",
|
||||
"qihexian": "齐河县",
|
||||
"qingdao": "青岛",
|
||||
"qingdaogaoxinjishuchanyekaifaqu": "青岛高新技术产业开发区",
|
||||
"qingdaoshi": "青岛",
|
||||
"qingyunxian": "庆云县",
|
||||
"qingzhou": "青州市",
|
||||
"qingzhoushi": "青州市",
|
||||
"qixia": "栖霞市",
|
||||
"qixiashi": "栖霞市",
|
||||
"qufu": "曲阜市",
|
||||
"qufushi": "曲阜市",
|
||||
"renchengqu": "任城区",
|
||||
"rizhao": "日照",
|
||||
"rizhaojingjijishukaifaqu": "日照经济技术开发区",
|
||||
"rizhaoshi": "日照",
|
||||
"rongcheng": "荣成市",
|
||||
"rongchengshi": "荣成市",
|
||||
"rushan": "乳山市",
|
||||
"rushanshi": "乳山市",
|
||||
"shanghexian": "商河县",
|
||||
"shantingqu": "山亭区",
|
||||
"shenxian": "莘县",
|
||||
"shibeiqu": "市北区",
|
||||
"shinanqu": "市南区",
|
||||
"shixiaqu": "市辖区",
|
||||
"shizhongqu": "市中区",
|
||||
"shouguang": "寿光市",
|
||||
"shouguangshi": "寿光市",
|
||||
"sishuixian": "泗水县",
|
||||
"taian": "泰安",
|
||||
"taianshi": "泰安",
|
||||
"taierzhuangqu": "台儿庄区",
|
||||
"taishanqu": "泰山区",
|
||||
"tanchengxian": "郯城县",
|
||||
"tengzhou": "滕州市",
|
||||
"tengzhoushi": "滕州市",
|
||||
"tianqiaoqu": "天桥区",
|
||||
"weichengqu": "潍城区",
|
||||
"weifang": "潍坊",
|
||||
"weifangbinhaijingjijishukaifaqu": "潍坊滨海经济技术开发区",
|
||||
"weifangshi": "潍坊",
|
||||
"weihai": "威海",
|
||||
"weihaihuojugaojishuchanyekaifaqu": "威海火炬高技术产业开发区",
|
||||
"weihaijingjijishukaifaqu": "威海经济技术开发区",
|
||||
"weihailingangjingjijishukaifaqu": "威海临港经济技术开发区",
|
||||
"weihaishi": "威海",
|
||||
"weishanxian": "微山县",
|
||||
"wendengqu": "文登区",
|
||||
"wenshangxian": "汶上县",
|
||||
"wuchengxian": "武城县",
|
||||
"wudixian": "无棣县",
|
||||
"wulianxian": "五莲县",
|
||||
"xiajinxian": "夏津县",
|
||||
"xintai": "新泰市",
|
||||
"xintaishi": "新泰市",
|
||||
"xuechengqu": "薛城区",
|
||||
"yangguxian": "阳谷县",
|
||||
"yangxinxian": "阳信县",
|
||||
"yantai": "烟台",
|
||||
"yantaigaoxinjishuchanyekaifaqu": "烟台高新技术产业开发区",
|
||||
"yantaijingjijishukaifaqu": "烟台经济技术开发区",
|
||||
"yantaishi": "烟台",
|
||||
"yanzhouqu": "兖州区",
|
||||
"yichengqu": "峄城区",
|
||||
"yinanxian": "沂南县",
|
||||
"yishuixian": "沂水县",
|
||||
"yiyuanxian": "沂源县",
|
||||
"yucheng": "禹城市",
|
||||
"yuchengshi": "禹城市",
|
||||
"yunchengxian": "郓城县",
|
||||
"yutaixian": "鱼台县",
|
||||
"zaozhuang": "枣庄",
|
||||
"zaozhuangshi": "枣庄",
|
||||
"zhangdianqu": "张店区",
|
||||
"zhangqingqu": "长清区",
|
||||
"zhangqiuqu": "章丘区",
|
||||
"zhanhuaqu": "沾化区",
|
||||
"zhaoyuan": "招远市",
|
||||
"zhaoyuanshi": "招远市",
|
||||
"zhifuqu": "芝罘区",
|
||||
"zhoucunqu": "周村区",
|
||||
"zhucheng": "诸城市",
|
||||
"zhuchengshi": "诸城市",
|
||||
"zibo": "淄博",
|
||||
"ziboshi": "淄博",
|
||||
"zichuanqu": "淄川区",
|
||||
"zoucheng": "邹城市",
|
||||
"zouchengshi": "邹城市",
|
||||
"zouping": "邹平市",
|
||||
"zoupingshi": "邹平市"
|
||||
},
|
||||
"shanghai": {
|
||||
"baoshanqu": "宝山区",
|
||||
"chongmingqu": "崇明区",
|
||||
"fengxianqu": "奉贤区",
|
||||
"hongkouqu": "虹口区",
|
||||
"huangpuqu": "黄浦区",
|
||||
"jiadingqu": "嘉定区",
|
||||
"jinganqu": "静安区",
|
||||
"jinshanqu": "金山区",
|
||||
"minxingqu": "闵行区",
|
||||
"pudongxinqu": "浦东新区",
|
||||
"putuoqu": "普陀区",
|
||||
"qingpuqu": "青浦区",
|
||||
"songjiangqu": "松江区",
|
||||
"xuhuiqu": "徐汇区",
|
||||
"yangpuqu": "杨浦区",
|
||||
"zhangningqu": "长宁区"
|
||||
},
|
||||
"shanxi": {
|
||||
"ankang": "安康",
|
||||
"ankangshi": "安康",
|
||||
"ansaiqu": "安塞区",
|
||||
"anzexian": "安泽县",
|
||||
"baihexian": "白河县",
|
||||
"baishuixian": "白水县",
|
||||
"baodexian": "保德县",
|
||||
"baoji": "宝鸡",
|
||||
"baojishi": "宝鸡",
|
||||
"baotaqu": "宝塔区",
|
||||
"baqiaoqu": "灞桥区",
|
||||
"bei": "碑林区",
|
||||
"beilinqu": "碑林区",
|
||||
"binzhou": "彬州市",
|
||||
"binzhoushi": "彬州市",
|
||||
"changanqu": "长安区",
|
||||
"chencangqu": "陈仓区",
|
||||
"chengchengxian": "澄城县",
|
||||
"chengguxian": "城固县",
|
||||
"chengqu": "城区",
|
||||
"chunhuaxian": "淳化县",
|
||||
"daixian": "代县",
|
||||
"dalixian": "大荔县",
|
||||
"danfengxian": "丹凤县",
|
||||
"daningxian": "大宁县",
|
||||
"datong": "大同",
|
||||
"datongshi": "大同",
|
||||
"dingbianxian": "定边县",
|
||||
"dingxiangxian": "定襄县",
|
||||
"fangshanxian": "方山县",
|
||||
"fanzhixian": "繁峙县",
|
||||
"fengxian": "凤县",
|
||||
"fengxiangqu": "凤翔区",
|
||||
"fengxiangxian": "凤翔县",
|
||||
"fenxixian": "汾西县",
|
||||
"fenyang": "汾阳市",
|
||||
"fenyangshi": "汾阳市",
|
||||
"fufengxian": "扶风县",
|
||||
"fuguxian": "府谷县",
|
||||
"fupingxian": "富平县",
|
||||
"fushanxian": "浮山县",
|
||||
"fuxian": "富县",
|
||||
"ganquanxian": "甘泉县",
|
||||
"gaolingqu": "高陵区",
|
||||
"gaoping": "高平市",
|
||||
"gaopingshi": "高平市",
|
||||
"guanglingxian": "广灵县",
|
||||
"gujiao": "古交市",
|
||||
"gujiaoshi": "古交市",
|
||||
"guxian": "古县",
|
||||
"hanbinqu": "汉滨区",
|
||||
"hancheng": "韩城市",
|
||||
"hanchengshi": "韩城市",
|
||||
"hantaiqu": "汉台区",
|
||||
"hanyinxian": "汉阴县",
|
||||
"hanzhong": "汉中",
|
||||
"hanzhongshi": "汉中",
|
||||
"hejin": "河津市",
|
||||
"hejinshi": "河津市",
|
||||
"hengshanqu": "横山区",
|
||||
"hequxian": "河曲县",
|
||||
"heshunxian": "和顺县",
|
||||
"heyangxian": "合阳县",
|
||||
"hongdongxian": "洪洞县",
|
||||
"houma": "侯马市",
|
||||
"houmashi": "侯马市",
|
||||
"huairen": "怀仁市",
|
||||
"huairenshi": "怀仁市",
|
||||
"huanglingxian": "黄陵县",
|
||||
"huanglongxian": "黄龙县",
|
||||
"huayin": "华阴市",
|
||||
"huayinshi": "华阴市",
|
||||
"huazhouqu": "华州区",
|
||||
"huguanxian": "壶关县",
|
||||
"hunyuanxian": "浑源县",
|
||||
"huozhou": "霍州市",
|
||||
"huozhoushi": "霍州市",
|
||||
"huyiqu": "鄠邑区",
|
||||
"jiancaopingqu": "尖草坪区",
|
||||
"jiangxian": "绛县",
|
||||
"jiaochengxian": "交城县",
|
||||
"jiaokouxian": "交口县",
|
||||
"jiaoqu": "郊区",
|
||||
"jiaxian": "佳县",
|
||||
"jiexiu": "介休市",
|
||||
"jiexiushi": "介休市",
|
||||
"jincheng": "晋城",
|
||||
"jinchengshi": "晋城",
|
||||
"jingbianxian": "靖边县",
|
||||
"jinglexian": "静乐县",
|
||||
"jingyangxian": "泾阳县",
|
||||
"jintaiqu": "金台区",
|
||||
"jinyuanqu": "晋源区",
|
||||
"jinzhong": "晋中",
|
||||
"jinzhongshi": "晋中",
|
||||
"jishanxian": "稷山县",
|
||||
"jixian": "吉县",
|
||||
"kelanxian": "岢岚县",
|
||||
"kuangqu": "矿区",
|
||||
"langaoxian": "岚皋县",
|
||||
"lantianxian": "蓝田县",
|
||||
"lanxian": "岚县",
|
||||
"lianhuqu": "莲湖区",
|
||||
"lichengxian": "黎城县",
|
||||
"linfen": "临汾",
|
||||
"linfenshi": "临汾",
|
||||
"lingchuanxian": "陵川县",
|
||||
"lingqiuxian": "灵丘县",
|
||||
"lingshixian": "灵石县",
|
||||
"lintongqu": "临潼区",
|
||||
"linweiqu": "临渭区",
|
||||
"linxian": "临县",
|
||||
"linyixian": "临猗县",
|
||||
"linyouxian": "麟游县",
|
||||
"liquanxian": "礼泉县",
|
||||
"lishiqu": "离石区",
|
||||
"liubaxian": "留坝县",
|
||||
"liulinxian": "柳林县",
|
||||
"longxian": "陇县",
|
||||
"loufanxian": "娄烦县",
|
||||
"luchengqu": "潞城区",
|
||||
"luochuanxian": "洛川县",
|
||||
"luonanxian": "洛南县",
|
||||
"luzhouqu": "潞州区",
|
||||
"lveyangxian": "略阳县",
|
||||
"lvliang": "吕梁",
|
||||
"lvliangshi": "吕梁",
|
||||
"meixian": "眉县",
|
||||
"mianxian": "勉县",
|
||||
"mizhixian": "米脂县",
|
||||
"nanzhengqu": "南郑区",
|
||||
"ningqiangxian": "宁强县",
|
||||
"ningshanxian": "宁陕县",
|
||||
"ningwuxian": "宁武县",
|
||||
"pianguanxian": "偏关县",
|
||||
"pingchengqu": "平城区",
|
||||
"pingdingxian": "平定县",
|
||||
"pinglixian": "平利县",
|
||||
"pingluqu": "平鲁区",
|
||||
"pingluxian": "平陆县",
|
||||
"pingshunxian": "平顺县",
|
||||
"pingyaoxian": "平遥县",
|
||||
"puchengxian": "蒲城县",
|
||||
"puxian": "蒲县",
|
||||
"qianxian": "乾县",
|
||||
"qianyangxian": "千阳县",
|
||||
"qindouqu": "秦都区",
|
||||
"qingjianxian": "清涧县",
|
||||
"qingxuxian": "清徐县",
|
||||
"qinshuixian": "沁水县",
|
||||
"qinxian": "沁县",
|
||||
"qinyuanxian": "沁源县",
|
||||
"qishanxian": "岐山县",
|
||||
"qixian": "祁县",
|
||||
"quwoxian": "曲沃县",
|
||||
"ruichengxian": "芮城县",
|
||||
"sanyuanxian": "三原县",
|
||||
"shangdangqu": "上党区",
|
||||
"shangluo": "商洛",
|
||||
"shangluoshi": "商洛",
|
||||
"shangnanxian": "商南县",
|
||||
"shangzhouqu": "商州区",
|
||||
"shanxidatongjingjikaifaqu": "山西大同经济开发区",
|
||||
"shanxishuozhoujingjikaifaqu": "山西朔州经济开发区",
|
||||
"shanxizhangzhigaoxinjishuchanyeyuanqu": "山西长治高新技术产业园区",
|
||||
"shanxizhuanxingzonghegaigeshifanqu": "山西转型综合改革示范区",
|
||||
"shanyangxian": "山阳县",
|
||||
"shanyinxian": "山阴县",
|
||||
"shenchixian": "神池县",
|
||||
"shenmu": "神木市",
|
||||
"shenmushi": "神木市",
|
||||
"shilouxian": "石楼县",
|
||||
"shiquanxian": "石泉县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shouyangxian": "寿阳县",
|
||||
"shuochengqu": "朔城区",
|
||||
"shuozhou": "朔州",
|
||||
"shuozhoushi": "朔州",
|
||||
"suidexian": "绥德县",
|
||||
"taibaixian": "太白县",
|
||||
"taiguqu": "太谷区",
|
||||
"taiyuan": "太原",
|
||||
"taiyuanshi": "太原",
|
||||
"tianzhenxian": "天镇县",
|
||||
"tongchuan": "铜川",
|
||||
"tongchuanshi": "铜川",
|
||||
"tongguanxian": "潼关县",
|
||||
"tunliuqu": "屯留区",
|
||||
"wanbo": "万柏林区",
|
||||
"wanbolinqu": "万柏林区",
|
||||
"wangyiqu": "王益区",
|
||||
"wanrongxian": "万荣县",
|
||||
"weibinqu": "渭滨区",
|
||||
"weichengqu": "渭城区",
|
||||
"weinan": "渭南",
|
||||
"weinanshi": "渭南",
|
||||
"weiyangqu": "未央区",
|
||||
"wenshuixian": "文水县",
|
||||
"wenxixian": "闻喜县",
|
||||
"wubuxian": "吴堡县",
|
||||
"wugongxian": "武功县",
|
||||
"wuqixian": "吴起县",
|
||||
"wutaishanfengjingmingshengqu": "五台山风景名胜区",
|
||||
"wutaixian": "五台县",
|
||||
"wuxiangxian": "武乡县",
|
||||
"wuzhaixian": "五寨县",
|
||||
"xian": "西安",
|
||||
"xiangfenxian": "襄汾县",
|
||||
"xiangningxian": "乡宁县",
|
||||
"xiangyuanxian": "襄垣县",
|
||||
"xianshi": "西安",
|
||||
"xianyang": "咸阳",
|
||||
"xianyangshi": "咸阳",
|
||||
"xiaodianqu": "小店区",
|
||||
"xiaoyi": "孝义市",
|
||||
"xiaoyishi": "孝义市",
|
||||
"xiaxian": "夏县",
|
||||
"xinchengqu": "新城区",
|
||||
"xinfuqu": "忻府区",
|
||||
"xinghualingqu": "杏花岭区",
|
||||
"xingping": "兴平市",
|
||||
"xingpingshi": "兴平市",
|
||||
"xingxian": "兴县",
|
||||
"xinjiangxian": "新绛县",
|
||||
"xinrongqu": "新荣区",
|
||||
"xinzhou": "忻州",
|
||||
"xinzhoushi": "忻州",
|
||||
"xixian": "隰县",
|
||||
"xixiangxian": "西乡县",
|
||||
"xiyangxian": "昔阳县",
|
||||
"xunyang": "旬阳市",
|
||||
"xunyangshi": "旬阳市",
|
||||
"xunyangxian": "旬阳县",
|
||||
"xunyixian": "旬邑县",
|
||||
"yanan": "延安",
|
||||
"yananshi": "延安",
|
||||
"yanchangxian": "延长县",
|
||||
"yanchuanxian": "延川县",
|
||||
"yangchengxian": "阳城县",
|
||||
"yanggaoxian": "阳高县",
|
||||
"yanglingqu": "杨陵区",
|
||||
"yangquan": "阳泉",
|
||||
"yangquanshi": "阳泉",
|
||||
"yangquxian": "阳曲县",
|
||||
"yangxian": "洋县",
|
||||
"yanhuqu": "盐湖区",
|
||||
"yanliangqu": "阎良区",
|
||||
"yantaqu": "雁塔区",
|
||||
"yaodouqu": "尧都区",
|
||||
"yaozhouqu": "耀州区",
|
||||
"yichengxian": "翼城县",
|
||||
"yichuanxian": "宜川县",
|
||||
"yijunxian": "宜君县",
|
||||
"yingxian": "应县",
|
||||
"yingzequ": "迎泽区",
|
||||
"yintaiqu": "印台区",
|
||||
"yonghexian": "永和县",
|
||||
"yongji": "永济市",
|
||||
"yongjishi": "永济市",
|
||||
"yongshouxian": "永寿县",
|
||||
"youyuxian": "右玉县",
|
||||
"yuanping": "原平市",
|
||||
"yuanpingshi": "原平市",
|
||||
"yuanquxian": "垣曲县",
|
||||
"yuciqu": "榆次区",
|
||||
"yulin": "榆林",
|
||||
"yulinshi": "榆林",
|
||||
"yuncheng": "运城",
|
||||
"yunchengshi": "运城",
|
||||
"yungangqu": "云冈区",
|
||||
"yunzhouqu": "云州区",
|
||||
"yushexian": "榆社县",
|
||||
"yuxian": "盂县",
|
||||
"yuyangqu": "榆阳区",
|
||||
"zezhouxian": "泽州县",
|
||||
"zhangwuxian": "长武县",
|
||||
"zhangzhi": "长治",
|
||||
"zhangzhishi": "长治",
|
||||
"zhangzixian": "长子县",
|
||||
"zhashuixian": "柞水县",
|
||||
"zhenanxian": "镇安县",
|
||||
"zhenbaxian": "镇巴县",
|
||||
"zhenpingxian": "镇坪县",
|
||||
"zhidanxian": "志丹县",
|
||||
"zhongyangxian": "中阳县",
|
||||
"zhouzhixian": "周至县",
|
||||
"ziyangxian": "紫阳县",
|
||||
"zizhang": "子长市",
|
||||
"zizhangshi": "子长市",
|
||||
"zizhouxian": "子洲县",
|
||||
"zuoquanxian": "左权县",
|
||||
"zuoyunxian": "左云县"
|
||||
},
|
||||
"sichuan": {
|
||||
"abaxian": "阿坝县",
|
||||
"abazangzuqiangzu": "阿坝藏族羌族",
|
||||
"abazangzuqiangzuzizhizhou": "阿坝藏族羌族",
|
||||
"anjuqu": "安居区",
|
||||
"anyuexian": "安岳县",
|
||||
"anzhouqu": "安州区",
|
||||
"baiyuxian": "白玉县",
|
||||
"baoxingxian": "宝兴县",
|
||||
"batangxian": "巴塘县",
|
||||
"bazhong": "巴中",
|
||||
"bazhongjingjikaifaqu": "巴中经济开发区",
|
||||
"bazhongshi": "巴中",
|
||||
"bazhouqu": "巴州区",
|
||||
"beichuanqiangzuzizhixian": "北川羌族自治县",
|
||||
"butuoxian": "布拖县",
|
||||
"cangxixian": "苍溪县",
|
||||
"chaotianqu": "朝天区",
|
||||
"chengdu": "成都",
|
||||
"chengdushi": "成都",
|
||||
"chenghuaqu": "成华区",
|
||||
"chongzhou": "崇州市",
|
||||
"chongzhoushi": "崇州市",
|
||||
"chuanshanqu": "船山区",
|
||||
"cuipingqu": "翠屏区",
|
||||
"daanqu": "大安区",
|
||||
"dachuanqu": "达川区",
|
||||
"danbaxian": "丹巴县",
|
||||
"danlengxian": "丹棱县",
|
||||
"daochengxian": "稻城县",
|
||||
"daofuxian": "道孚县",
|
||||
"dayingxian": "大英县",
|
||||
"dayixian": "大邑县",
|
||||
"dazhou": "达州",
|
||||
"dazhoujingjikaifaqu": "达州经济开发区",
|
||||
"dazhoushi": "达州",
|
||||
"dazhuxian": "大竹县",
|
||||
"dechangxian": "德昌县",
|
||||
"degexian": "德格县",
|
||||
"derongxian": "得荣县",
|
||||
"deyang": "德阳",
|
||||
"deyangshi": "德阳",
|
||||
"dongpoqu": "东坡区",
|
||||
"dongqu": "东区",
|
||||
"dongxingqu": "东兴区",
|
||||
"dujiangyan": "都江堰市",
|
||||
"dujiangyanshi": "都江堰市",
|
||||
"ebianyizuzizhixian": "峨边彝族自治县",
|
||||
"emeishan": "峨眉山市",
|
||||
"emeishanshi": "峨眉山市",
|
||||
"enyangqu": "恩阳区",
|
||||
"fuchengqu": "涪城区",
|
||||
"fushunxian": "富顺县",
|
||||
"ganluoxian": "甘洛县",
|
||||
"ganzixian": "甘孜县",
|
||||
"ganzizangzu": "甘孜藏族",
|
||||
"ganzizangzuzizhizhou": "甘孜藏族",
|
||||
"gaopingqu": "高坪区",
|
||||
"gaoxian": "高县",
|
||||
"gongjingqu": "贡井区",
|
||||
"gongxian": "珙县",
|
||||
"guangan": "广安",
|
||||
"guanganqu": "广安区",
|
||||
"guanganshi": "广安",
|
||||
"guanghan": "广汉市",
|
||||
"guanghanshi": "广汉市",
|
||||
"guangyuan": "广元",
|
||||
"guangyuanshi": "广元",
|
||||
"gulinxian": "古蔺县",
|
||||
"hanyuanxian": "汉源县",
|
||||
"heishuixian": "黑水县",
|
||||
"hejiangxian": "合江县",
|
||||
"hongyaxian": "洪雅县",
|
||||
"hongyuanxian": "红原县",
|
||||
"huaying": "华蓥市",
|
||||
"huayingshi": "华蓥市",
|
||||
"huidongxian": "会东县",
|
||||
"huili": "会理市",
|
||||
"huilishi": "会理市",
|
||||
"huilixian": "会理县",
|
||||
"jiajiangxian": "夹江县",
|
||||
"jialingqu": "嘉陵区",
|
||||
"jianganxian": "江安县",
|
||||
"jiangexian": "剑阁县",
|
||||
"jiangyangqu": "江阳区",
|
||||
"jiangyou": "江油市",
|
||||
"jiangyoushi": "江油市",
|
||||
"jianyang": "简阳市",
|
||||
"jianyangshi": "简阳市",
|
||||
"jinchuanxian": "金川县",
|
||||
"jingyangqu": "旌阳区",
|
||||
"jingyanxian": "井研县",
|
||||
"jinjiangqu": "锦江区",
|
||||
"jinkouhequ": "金口河区",
|
||||
"jinniuqu": "金牛区",
|
||||
"jintangxian": "金堂县",
|
||||
"jinyangxian": "金阳县",
|
||||
"jiulongxian": "九龙县",
|
||||
"jiuzhaigouxian": "九寨沟县",
|
||||
"kaijiangxian": "开江县",
|
||||
"kangding": "康定市",
|
||||
"kangdingshi": "康定市",
|
||||
"langzhong": "阆中市",
|
||||
"langzhongshi": "阆中市",
|
||||
"leiboxian": "雷波县",
|
||||
"leshan": "乐山",
|
||||
"leshanshi": "乐山",
|
||||
"lezhixian": "乐至县",
|
||||
"liangshanyizu": "凉山彝族",
|
||||
"liangshanyizuzizhizhou": "凉山彝族",
|
||||
"linshuixian": "邻水县",
|
||||
"litangxian": "理塘县",
|
||||
"lixian": "理县",
|
||||
"lizhouqu": "利州区",
|
||||
"longchang": "隆昌市",
|
||||
"longchangshi": "隆昌市",
|
||||
"longmatanqu": "龙马潭区",
|
||||
"longquanyiqu": "龙泉驿区",
|
||||
"ludingxian": "泸定县",
|
||||
"luhuoxian": "炉霍县",
|
||||
"luojiangqu": "罗江区",
|
||||
"lushanxian": "芦山县",
|
||||
"luxian": "泸县",
|
||||
"luzhou": "泸州",
|
||||
"luzhoushi": "泸州",
|
||||
"mabianyizuzizhixian": "马边彝族自治县",
|
||||
"maerkang": "马尔康市",
|
||||
"maerkangshi": "马尔康市",
|
||||
"maoxian": "茂县",
|
||||
"meiguxian": "美姑县",
|
||||
"meishan": "眉山",
|
||||
"meishanshi": "眉山",
|
||||
"mianningxian": "冕宁县",
|
||||
"mianyang": "绵阳",
|
||||
"mianyangshi": "绵阳",
|
||||
"mianzhu": "绵竹市",
|
||||
"mianzhushi": "绵竹市",
|
||||
"mingshanqu": "名山区",
|
||||
"miyixian": "米易县",
|
||||
"muchuanxian": "沐川县",
|
||||
"mulizangzuzizhixian": "木里藏族自治县",
|
||||
"nanbuxian": "南部县",
|
||||
"nanchong": "南充",
|
||||
"nanchongshi": "南充",
|
||||
"nanjiangxian": "南江县",
|
||||
"nanxiqu": "南溪区",
|
||||
"naxiqu": "纳溪区",
|
||||
"neijiang": "内江",
|
||||
"neijiangjingjikaifaqu": "内江经济开发区",
|
||||
"neijiangshi": "内江",
|
||||
"ningnanxian": "宁南县",
|
||||
"panzhihua": "攀枝花",
|
||||
"panzhihuashi": "攀枝花",
|
||||
"penganxian": "蓬安县",
|
||||
"pengshanqu": "彭山区",
|
||||
"pengxixian": "蓬溪县",
|
||||
"pengzhou": "彭州市",
|
||||
"pengzhoushi": "彭州市",
|
||||
"pidouqu": "郫都区",
|
||||
"pingchangxian": "平昌县",
|
||||
"pingshanxian": "屏山县",
|
||||
"pingwuxian": "平武县",
|
||||
"pugexian": "普格县",
|
||||
"pujiangxian": "蒲江县",
|
||||
"qianfengqu": "前锋区",
|
||||
"qianweixian": "犍为县",
|
||||
"qingbaijiangqu": "青白江区",
|
||||
"qingchuanxian": "青川县",
|
||||
"qingshenxian": "青神县",
|
||||
"qingyangqu": "青羊区",
|
||||
"qionglai": "邛崃市",
|
||||
"qionglaishi": "邛崃市",
|
||||
"quxian": "渠县",
|
||||
"rangtangxian": "壤塘县",
|
||||
"renhequ": "仁和区",
|
||||
"renshouxian": "仁寿县",
|
||||
"rongxian": "荣县",
|
||||
"ruoergaixian": "若尔盖县",
|
||||
"santaixian": "三台县",
|
||||
"sedaxian": "色达县",
|
||||
"shawanqu": "沙湾区",
|
||||
"shehong": "射洪市",
|
||||
"shehongshi": "射洪市",
|
||||
"shenfang": "什邡市",
|
||||
"shenfangshi": "什邡市",
|
||||
"shimianxian": "石棉县",
|
||||
"shiquxian": "石渠县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shizhongqu": "市中区",
|
||||
"shuangliuqu": "双流区",
|
||||
"shunqingqu": "顺庆区",
|
||||
"songpanxian": "松潘县",
|
||||
"suining": "遂宁",
|
||||
"suiningshi": "遂宁",
|
||||
"tianquanxian": "天全县",
|
||||
"tongchuanqu": "通川区",
|
||||
"tongjiangxian": "通江县",
|
||||
"wangcangxian": "旺苍县",
|
||||
"wanyuan": "万源市",
|
||||
"wanyuanshi": "万源市",
|
||||
"weiyuanxian": "威远县",
|
||||
"wenchuanxian": "汶川县",
|
||||
"wenjiangqu": "温江区",
|
||||
"wuhouqu": "武侯区",
|
||||
"wushengxian": "武胜县",
|
||||
"wutongqiaoqu": "五通桥区",
|
||||
"xiangchengxian": "乡城县",
|
||||
"xiaojinxian": "小金县",
|
||||
"xichang": "西昌市",
|
||||
"xichangshi": "西昌市",
|
||||
"xichongxian": "西充县",
|
||||
"xidexian": "喜德县",
|
||||
"xindouqu": "新都区",
|
||||
"xingjingxian": "荥经县",
|
||||
"xingwenxian": "兴文县",
|
||||
"xinjinqu": "新津区",
|
||||
"xinlongxian": "新龙县",
|
||||
"xiqu": "西区",
|
||||
"xuanhanxian": "宣汉县",
|
||||
"xuyongxian": "叙永县",
|
||||
"xuzhouqu": "叙州区",
|
||||
"yaan": "雅安",
|
||||
"yaanshi": "雅安",
|
||||
"yajiangxian": "雅江县",
|
||||
"yanbianxian": "盐边县",
|
||||
"yanjiangqu": "雁江区",
|
||||
"yantanqu": "沿滩区",
|
||||
"yantingxian": "盐亭县",
|
||||
"yanyuanxian": "盐源县",
|
||||
"yibin": "宜宾",
|
||||
"yibinshi": "宜宾",
|
||||
"yilongxian": "仪陇县",
|
||||
"yingshanxian": "营山县",
|
||||
"youxianqu": "游仙区",
|
||||
"yuchengqu": "雨城区",
|
||||
"yuechixian": "岳池县",
|
||||
"yuexixian": "越西县",
|
||||
"yunlianxian": "筠连县",
|
||||
"zhangningxian": "长宁县",
|
||||
"zhaohuaqu": "昭化区",
|
||||
"zhaojuexian": "昭觉县",
|
||||
"zhongjiangxian": "中江县",
|
||||
"zigong": "自贡",
|
||||
"zigongshi": "自贡",
|
||||
"ziliujingqu": "自流井区",
|
||||
"zitongxian": "梓潼县",
|
||||
"ziyang": "资阳",
|
||||
"ziyangshi": "资阳",
|
||||
"zizhongxian": "资中县"
|
||||
},
|
||||
"tianjin": {
|
||||
"bao": "宝坻区",
|
||||
"baodiqu": "宝坻区",
|
||||
"beichenqu": "北辰区",
|
||||
"binhaixinqu": "滨海新区",
|
||||
"dongliqu": "东丽区",
|
||||
"hebeiqu": "河北区",
|
||||
"hedongqu": "河东区",
|
||||
"hepingqu": "和平区",
|
||||
"hexiqu": "河西区",
|
||||
"hongqiaoqu": "红桥区",
|
||||
"jinghaiqu": "静海区",
|
||||
"jinnanqu": "津南区",
|
||||
"jizhouqu": "蓟州区",
|
||||
"nankaiqu": "南开区",
|
||||
"ninghequ": "宁河区",
|
||||
"wuqingqu": "武清区",
|
||||
"xiqingqu": "西青区"
|
||||
},
|
||||
"xianggang": {
|
||||
"beiqu": "北区",
|
||||
"dabuqu": "大埔区",
|
||||
"dongqu": "东区",
|
||||
"guantangqu": "观塘区",
|
||||
"huangdaxianqu": "黄大仙区",
|
||||
"jiulongchengqu": "九龙城区",
|
||||
"kuiqingqu": "葵青区",
|
||||
"lidaoqu": "离岛区",
|
||||
"nanqu": "南区",
|
||||
"quanwanqu": "荃湾区",
|
||||
"shatianqu": "沙田区",
|
||||
"shenshuibuqu": "深水埗区",
|
||||
"tunmenqu": "屯门区",
|
||||
"wanzaiqu": "湾仔区",
|
||||
"xigongqu": "西贡区",
|
||||
"youjianwangqu": "油尖旺区",
|
||||
"yuanlangqu": "元朗区",
|
||||
"zhongxiqu": "中西区"
|
||||
},
|
||||
"xinjiang": {
|
||||
"aheqixian": "阿合奇县",
|
||||
"akesu": "阿克苏",
|
||||
"akesudiqu": "阿克苏",
|
||||
"akesushi": "阿克苏市",
|
||||
"aketaoxian": "阿克陶县",
|
||||
"alaer": "阿拉尔市",
|
||||
"alaershi": "阿拉尔市",
|
||||
"alashankou": "阿拉山口市",
|
||||
"alashankoushi": "阿拉山口市",
|
||||
"aleitai": "阿勒泰",
|
||||
"aleitaidiqu": "阿勒泰",
|
||||
"aleitaishi": "阿勒泰市",
|
||||
"atushen": "阿图什市",
|
||||
"atushenshi": "阿图什市",
|
||||
"awatixian": "阿瓦提县",
|
||||
"bachuxian": "巴楚县",
|
||||
"baichengxian": "拜城县",
|
||||
"baijiantanqu": "白碱滩区",
|
||||
"balikunhasakezizhixian": "巴里坤哈萨克自治县",
|
||||
"bayinguolengmenggu": "巴音郭楞蒙古",
|
||||
"bayinguolengmengguzizhizhou": "巴音郭楞蒙古",
|
||||
"beitun": "北屯市",
|
||||
"beitunshi": "北屯市",
|
||||
"boertalamenggu": "博尔塔拉蒙古",
|
||||
"boertalamengguzizhizhou": "博尔塔拉蒙古",
|
||||
"bohuxian": "博湖县",
|
||||
"bole": "博乐市",
|
||||
"boleshi": "博乐市",
|
||||
"buerjinxian": "布尔津县",
|
||||
"celeixian": "策勒县",
|
||||
"chabuchaerxibozizhixian": "察布查尔锡伯自治县",
|
||||
"changji": "昌吉市",
|
||||
"changjihuizu": "昌吉回族",
|
||||
"changjihuizuzizhizhou": "昌吉回族",
|
||||
"changjishi": "昌吉市",
|
||||
"dabanchengqu": "达坂城区",
|
||||
"dushanziqu": "独山子区",
|
||||
"eminxian": "额敏县",
|
||||
"fuhaixian": "福海县",
|
||||
"fukang": "阜康市",
|
||||
"fukangshi": "阜康市",
|
||||
"fuyunxian": "富蕴县",
|
||||
"gaochangqu": "高昌区",
|
||||
"gashixian": "伽师县",
|
||||
"gongliuxian": "巩留县",
|
||||
"habahexian": "哈巴河县",
|
||||
"hami": "哈密",
|
||||
"hamishi": "哈密",
|
||||
"hebukesaiermengguzizhixian": "和布克赛尔蒙古自治县",
|
||||
"hejingxian": "和静县",
|
||||
"heshuoxian": "和硕县",
|
||||
"hetian": "和田",
|
||||
"hetiandiqu": "和田",
|
||||
"hetianshi": "和田市",
|
||||
"hetianxian": "和田县",
|
||||
"huochengxian": "霍城县",
|
||||
"huoerguosi": "霍尔果斯市",
|
||||
"huoerguosishi": "霍尔果斯市",
|
||||
"hutubixian": "呼图壁县",
|
||||
"huyanghe": "胡杨河市",
|
||||
"huyangheshi": "胡杨河市",
|
||||
"jimunaixian": "吉木乃县",
|
||||
"jimusaerxian": "吉木萨尔县",
|
||||
"jinghexian": "精河县",
|
||||
"ka": "喀什",
|
||||
"kashi": "喀什",
|
||||
"kashidiqu": "喀什",
|
||||
"kashishi": "喀什市",
|
||||
"kekedala": "可克达拉市",
|
||||
"kekedalashi": "可克达拉市",
|
||||
"kelamayi": "克拉玛依",
|
||||
"kelamayiqu": "克拉玛依区",
|
||||
"kelamayishi": "克拉玛依",
|
||||
"kepingxian": "柯坪县",
|
||||
"kezileisukeerkezi": "克孜勒苏柯尔克孜",
|
||||
"kezileisukeerkezizizhizhou": "克孜勒苏柯尔克孜",
|
||||
"kuche": "库车市",
|
||||
"kucheshi": "库车市",
|
||||
"kuerlei": "库尔勒市",
|
||||
"kuerleijingjijishukaifaqu": "库尔勒经济技术开发区",
|
||||
"kuerleishi": "库尔勒市",
|
||||
"kuitun": "奎屯市",
|
||||
"kuitunshi": "奎屯市",
|
||||
"kunyu": "昆玉市",
|
||||
"kunyushi": "昆玉市",
|
||||
"luntaixian": "轮台县",
|
||||
"luopuxian": "洛浦县",
|
||||
"maigaitixian": "麦盖提县",
|
||||
"manasixian": "玛纳斯县",
|
||||
"midongqu": "米东区",
|
||||
"minfengxian": "民丰县",
|
||||
"moyuxian": "墨玉县",
|
||||
"muleihasakezizhixian": "木垒哈萨克自治县",
|
||||
"nileikexian": "尼勒克县",
|
||||
"pishanxian": "皮山县",
|
||||
"qiemoxian": "且末县",
|
||||
"qinghexian": "青河县",
|
||||
"qitaixian": "奇台县",
|
||||
"ruoqiangxian": "若羌县",
|
||||
"shachexian": "莎车县",
|
||||
"shanshanxian": "鄯善县",
|
||||
"shawan": "沙湾市",
|
||||
"shawanshi": "沙湾市",
|
||||
"shawanxian": "沙湾县",
|
||||
"shayaxian": "沙雅县",
|
||||
"shayibakequ": "沙依巴克区",
|
||||
"shihezi": "石河子市",
|
||||
"shihezishi": "石河子市",
|
||||
"shixiaqu": "市辖区",
|
||||
"shuanghe": "双河市",
|
||||
"shuangheshi": "双河市",
|
||||
"shufuxian": "疏附县",
|
||||
"shuimogouqu": "水磨沟区",
|
||||
"shulexian": "疏勒县",
|
||||
"tacheng": "塔城",
|
||||
"tachengdiqu": "塔城",
|
||||
"tachengshi": "塔城市",
|
||||
"tashenkuergantajikezizhixian": "塔什库尔干塔吉克自治县",
|
||||
"tekesixian": "特克斯县",
|
||||
"tianshanqu": "天山区",
|
||||
"tiemenguan": "铁门关市",
|
||||
"tiemenguanshi": "铁门关市",
|
||||
"toutunhequ": "头屯河区",
|
||||
"tulufan": "吐鲁番",
|
||||
"tulufanshi": "吐鲁番",
|
||||
"tumushuke": "图木舒克市",
|
||||
"tumushukeshi": "图木舒克市",
|
||||
"tuokexunxian": "托克逊县",
|
||||
"tuolixian": "托里县",
|
||||
"wenquanxian": "温泉县",
|
||||
"wensuxian": "温宿县",
|
||||
"wuerhequ": "乌尔禾区",
|
||||
"wujiaqu": "五家渠市",
|
||||
"wujiaqushi": "五家渠市",
|
||||
"wulumuqi": "乌鲁木齐",
|
||||
"wulumuqishi": "乌鲁木齐",
|
||||
"wulumuqixian": "乌鲁木齐县",
|
||||
"wuqiaxian": "乌恰县",
|
||||
"wushenxian": "乌什县",
|
||||
"wusu": "乌苏市",
|
||||
"wusushi": "乌苏市",
|
||||
"xinhexian": "新和县",
|
||||
"xinjiangweiwuerzizhiquzizhiquzhixiaxianjixingzhengquhua": "新疆维吾尔自治区-自治区直辖县级行政区划",
|
||||
"xinshiqu": "新市区",
|
||||
"xinxing": "新星市",
|
||||
"xinxingshi": "新星市",
|
||||
"xinyuanxian": "新源县",
|
||||
"yanqihuizuzizhixian": "焉耆回族自治县",
|
||||
"yechengxian": "叶城县",
|
||||
"yilihasake": "伊犁哈萨克",
|
||||
"yilihasakezizhizhou": "伊犁哈萨克",
|
||||
"yingjishaxian": "英吉沙县",
|
||||
"yining": "伊宁市",
|
||||
"yiningshi": "伊宁市",
|
||||
"yiningxian": "伊宁县",
|
||||
"yiwuxian": "伊吾县",
|
||||
"yizhouqu": "伊州区",
|
||||
"yuepuhuxian": "岳普湖县",
|
||||
"yulixian": "尉犁县",
|
||||
"yuminxian": "裕民县",
|
||||
"yutianxian": "于田县",
|
||||
"zepuxian": "泽普县",
|
||||
"zhaosuxian": "昭苏县"
|
||||
},
|
||||
"xizang": {
|
||||
"ali": "阿里",
|
||||
"alidiqu": "阿里",
|
||||
"anduoxian": "安多县",
|
||||
"angrenxian": "昂仁县",
|
||||
"bailangxian": "白朗县",
|
||||
"bangexian": "班戈县",
|
||||
"baqingxian": "巴青县",
|
||||
"basuxian": "八宿县",
|
||||
"bayiqu": "巴宜区",
|
||||
"bianbaxian": "边坝县",
|
||||
"biruxian": "比如县",
|
||||
"bomixian": "波密县",
|
||||
"changdou": "昌都",
|
||||
"changdu": "昌都",
|
||||
"changdushi": "昌都",
|
||||
"chayaxian": "察雅县",
|
||||
"chayuxian": "察隅县",
|
||||
"chengguanqu": "城关区",
|
||||
"cuomeixian": "措美县",
|
||||
"cuonaxian": "错那县",
|
||||
"cuoqinxian": "措勤县",
|
||||
"dangxiongxian": "当雄县",
|
||||
"dazigongyeyuanqu": "达孜工业园区",
|
||||
"daziqu": "达孜区",
|
||||
"dingjiexian": "定结县",
|
||||
"dingqingxian": "丁青县",
|
||||
"dingrixian": "定日县",
|
||||
"duilongdeqingqu": "堆龙德庆区",
|
||||
"gaerxian": "噶尔县",
|
||||
"gaizexian": "改则县",
|
||||
"gangbaxian": "岗巴县",
|
||||
"geermuzangqinggongyeyuanqu": "格尔木藏青工业园区",
|
||||
"gejixian": "革吉县",
|
||||
"gongbujiangdaxian": "工布江达县",
|
||||
"gonggaxian": "贡嘎县",
|
||||
"gongjuexian": "贡觉县",
|
||||
"jiachaxian": "加查县",
|
||||
"jialixian": "嘉黎县",
|
||||
"jiangdaxian": "江达县",
|
||||
"jiangzixian": "江孜县",
|
||||
"jilongxian": "吉隆县",
|
||||
"kangmaxian": "康马县",
|
||||
"karuoqu": "卡若区",
|
||||
"langqiazixian": "浪卡子县",
|
||||
"langxian": "朗县",
|
||||
"lasa": "拉萨",
|
||||
"lasajingjijishukaifaqu": "拉萨经济技术开发区",
|
||||
"lasashi": "拉萨",
|
||||
"lazixian": "拉孜县",
|
||||
"leiwuqixian": "类乌齐县",
|
||||
"linzhi": "林芝",
|
||||
"linzhishi": "林芝",
|
||||
"linzhouxian": "林周县",
|
||||
"longzixian": "隆子县",
|
||||
"luolongxian": "洛隆县",
|
||||
"luozhaxian": "洛扎县",
|
||||
"mangkangxian": "芒康县",
|
||||
"milinxian": "米林县",
|
||||
"motuoxian": "墨脱县",
|
||||
"mozhugongkaxian": "墨竹工卡县",
|
||||
"naidongqu": "乃东区",
|
||||
"nanmulinxian": "南木林县",
|
||||
"naqu": "那曲",
|
||||
"naqushi": "那曲",
|
||||
"nielamuxian": "聂拉木县",
|
||||
"nierongxian": "聂荣县",
|
||||
"nimaxian": "尼玛县",
|
||||
"nimuxian": "尼木县",
|
||||
"pulanxian": "普兰县",
|
||||
"qiongjiexian": "琼结县",
|
||||
"qushuixian": "曲水县",
|
||||
"qusongxian": "曲松县",
|
||||
"renbuxian": "仁布县",
|
||||
"rikaze": "日喀则",
|
||||
"rikazeshi": "日喀则",
|
||||
"rituxian": "日土县",
|
||||
"sagaxian": "萨嘎县",
|
||||
"sajiaxian": "萨迦县",
|
||||
"sangrixian": "桑日县",
|
||||
"sangzhuziqu": "桑珠孜区",
|
||||
"seniqu": "色尼区",
|
||||
"shannan": "山南",
|
||||
"shannanshi": "山南",
|
||||
"shenzhaxian": "申扎县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shuanghuxian": "双湖县",
|
||||
"suoxian": "索县",
|
||||
"xietongmenxian": "谢通门县",
|
||||
"xizangwenhualvyouchuangyiyuanqu": "西藏文化旅游创意园区",
|
||||
"yadongxian": "亚东县",
|
||||
"zhadaxian": "札达县",
|
||||
"zhanangxian": "扎囊县",
|
||||
"zhongbaxian": "仲巴县",
|
||||
"zuogongxian": "左贡县"
|
||||
},
|
||||
"yunnan": {
|
||||
"anning": "安宁市",
|
||||
"anningshi": "安宁市",
|
||||
"baoshan": "保山",
|
||||
"baoshanshi": "保山",
|
||||
"binchuanxian": "宾川县",
|
||||
"cangyuanwazuzizhixian": "沧源佤族自治县",
|
||||
"changningxian": "昌宁县",
|
||||
"chenggongqu": "呈贡区",
|
||||
"chengjiang": "澄江市",
|
||||
"chengjiangshi": "澄江市",
|
||||
"chuxiong": "楚雄市",
|
||||
"chuxiongshi": "楚雄市",
|
||||
"chuxiongyizu": "楚雄彝族",
|
||||
"chuxiongyizuzizhizhou": "楚雄彝族",
|
||||
"daguanxian": "大关县",
|
||||
"dali": "大理市",
|
||||
"dalibaizu": "大理白族",
|
||||
"dalibaizuzizhizhou": "大理白族",
|
||||
"dalishi": "大理市",
|
||||
"dayaoxian": "大姚县",
|
||||
"dehongdaizujingpozu": "德宏傣族景颇族",
|
||||
"dehongdaizujingpozuzizhizhou": "德宏傣族景颇族",
|
||||
"deqinxian": "德钦县",
|
||||
"diqingzangzu": "迪庆藏族",
|
||||
"diqingzangzuzizhizhou": "迪庆藏族",
|
||||
"dongchuanqu": "东川区",
|
||||
"eryuanxian": "洱源县",
|
||||
"eshanyizuzizhixian": "峨山彝族自治县",
|
||||
"fengqingxian": "凤庆县",
|
||||
"fugongxian": "福贡县",
|
||||
"fuminxian": "富民县",
|
||||
"funingxian": "富宁县",
|
||||
"fuyuanxian": "富源县",
|
||||
"gejiu": "个旧市",
|
||||
"gejiushi": "个旧市",
|
||||
"gengmadaizuwazuzizhixian": "耿马傣族佤族自治县",
|
||||
"gongshandulongzunuzuzizhixian": "贡山独龙族怒族自治县",
|
||||
"guanduqu": "官渡区",
|
||||
"guangnanxian": "广南县",
|
||||
"guchengqu": "古城区",
|
||||
"hekouyaozuzizhixian": "河口瑶族自治县",
|
||||
"heqingxian": "鹤庆县",
|
||||
"honghehanizuyizu": "红河哈尼族彝族",
|
||||
"honghehanizuyizuzizhizhou": "红河哈尼族彝族",
|
||||
"honghexian": "红河县",
|
||||
"hongtaqu": "红塔区",
|
||||
"huaningxian": "华宁县",
|
||||
"huapingxian": "华坪县",
|
||||
"huizexian": "会泽县",
|
||||
"jianchuanxian": "剑川县",
|
||||
"jiangchenghanizuyizuzizhixian": "江城哈尼族彝族自治县",
|
||||
"jiangchuanqu": "江川区",
|
||||
"jianshuixian": "建水县",
|
||||
"jingdongyizuzizhixian": "景东彝族自治县",
|
||||
"jinggudaizuyizuzizhixian": "景谷傣族彝族自治县",
|
||||
"jinghong": "景洪市",
|
||||
"jinghongshi": "景洪市",
|
||||
"jinningqu": "晋宁区",
|
||||
"jinpingmiaozuyaozudaizuzizhixian": "金平苗族瑶族傣族自治县",
|
||||
"kaiyuan": "开远市",
|
||||
"kaiyuanshi": "开远市",
|
||||
"kunming": "昆明",
|
||||
"kunmingshi": "昆明",
|
||||
"lancanglahuzuzizhixian": "澜沧拉祜族自治县",
|
||||
"lanpingbaizupumizuzizhixian": "兰坪白族普米族自治县",
|
||||
"lianghexian": "梁河县",
|
||||
"lijiang": "丽江",
|
||||
"lijiangshi": "丽江",
|
||||
"lincang": "临沧",
|
||||
"lincangshi": "临沧",
|
||||
"linxiangqu": "临翔区",
|
||||
"longchuanxian": "陇川县",
|
||||
"longlingxian": "龙陵县",
|
||||
"longyangqu": "隆阳区",
|
||||
"ludianxian": "鲁甸县",
|
||||
"lufeng": "禄丰市",
|
||||
"lufengshi": "禄丰市",
|
||||
"lufengxian": "禄丰县",
|
||||
"luliangxian": "陆良县",
|
||||
"luopingxian": "罗平县",
|
||||
"luquanyizumiaozuzizhixian": "禄劝彝族苗族自治县",
|
||||
"lushui": "泸水市",
|
||||
"lushuishi": "泸水市",
|
||||
"luxixian": "泸西县",
|
||||
"lvchunxian": "绿春县",
|
||||
"maguanxian": "马关县",
|
||||
"malipoxian": "麻栗坡县",
|
||||
"malongqu": "马龙区",
|
||||
"mang": "芒市",
|
||||
"mangshi": "芒市",
|
||||
"menghaixian": "勐海县",
|
||||
"menglaxian": "勐腊县",
|
||||
"mengliandaizulahuzuwazuzizhixian": "孟连傣族拉祜族佤族自治县",
|
||||
"mengzi": "蒙自市",
|
||||
"mengzishi": "蒙自市",
|
||||
"miduxian": "弥渡县",
|
||||
"mile": "弥勒市",
|
||||
"mileshi": "弥勒市",
|
||||
"mojianghanizuzizhixian": "墨江哈尼族自治县",
|
||||
"moudingxian": "牟定县",
|
||||
"nanhuaxian": "南华县",
|
||||
"nanjianyizuzizhixian": "南涧彝族自治县",
|
||||
"ningerhanizuyizuzizhixian": "宁洱哈尼族彝族自治县",
|
||||
"ninglangyizuzizhixian": "宁蒗彝族自治县",
|
||||
"nujianglisuzu": "怒江傈僳族",
|
||||
"nujianglisuzuzizhizhou": "怒江傈僳族",
|
||||
"panlongqu": "盘龙区",
|
||||
"pingbianmiaozuzizhixian": "屏边苗族自治县",
|
||||
"puer": "普洱",
|
||||
"puershi": "普洱",
|
||||
"qi": "麒麟区",
|
||||
"qiaojiaxian": "巧家县",
|
||||
"qilinqu": "麒麟区",
|
||||
"qiubeixian": "丘北县",
|
||||
"qujing": "曲靖",
|
||||
"qujingshi": "曲靖",
|
||||
"ruili": "瑞丽市",
|
||||
"ruilishi": "瑞丽市",
|
||||
"shidianxian": "施甸县",
|
||||
"shilinyizuzizhixian": "石林彝族自治县",
|
||||
"shipingxian": "石屏县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shizongxian": "师宗县",
|
||||
"shuangbaixian": "双柏县",
|
||||
"shuangjianglahuzuwazubulangzudaizuzizhixian": "双江拉祜族佤族布朗族傣族自治县",
|
||||
"shuifu": "水富市",
|
||||
"shuifushi": "水富市",
|
||||
"simaoqu": "思茅区",
|
||||
"songmingxian": "嵩明县",
|
||||
"suijiangxian": "绥江县",
|
||||
"tengchong": "腾冲市",
|
||||
"tengchongshi": "腾冲市",
|
||||
"tonghaixian": "通海县",
|
||||
"weishanyizuhuizuzizhixian": "巍山彝族回族自治县",
|
||||
"weixilisuzuzizhixian": "维西傈僳族自治县",
|
||||
"weixinxian": "威信县",
|
||||
"wenshan": "文山市",
|
||||
"wenshanshi": "文山市",
|
||||
"wenshanzhuangzumiaozu": "文山壮族苗族",
|
||||
"wenshanzhuangzumiaozuzizhizhou": "文山壮族苗族",
|
||||
"wudingxian": "武定县",
|
||||
"wuhuaqu": "五华区",
|
||||
"xianggelila": "香格里拉市",
|
||||
"xianggelilashi": "香格里拉市",
|
||||
"xiangyunxian": "祥云县",
|
||||
"xichouxian": "西畴县",
|
||||
"ximengwazuzizhixian": "西盟佤族自治县",
|
||||
"xinpingyizudaizuzizhixian": "新平彝族傣族自治县",
|
||||
"xishanqu": "西山区",
|
||||
"xishuangbannadaizu": "西双版纳傣族",
|
||||
"xishuangbannadaizuzizhizhou": "西双版纳傣族",
|
||||
"xuanwei": "宣威市",
|
||||
"xuanweishi": "宣威市",
|
||||
"xundianhuizuyizuzizhixian": "寻甸回族彝族自治县",
|
||||
"yangbiyizuzizhixian": "漾濞彝族自治县",
|
||||
"yanjinxian": "盐津县",
|
||||
"yanshanxian": "砚山县",
|
||||
"yaoanxian": "姚安县",
|
||||
"yiliangxian": "宜良县",
|
||||
"yimenxian": "易门县",
|
||||
"yingjiangxian": "盈江县",
|
||||
"yongdexian": "永德县",
|
||||
"yongpingxian": "永平县",
|
||||
"yongrenxian": "永仁县",
|
||||
"yongshanxian": "永善县",
|
||||
"yongshengxian": "永胜县",
|
||||
"yuanjianghanizuyizudaizuzizhixian": "元江哈尼族彝族傣族自治县",
|
||||
"yuanmouxian": "元谋县",
|
||||
"yuanyangxian": "元阳县",
|
||||
"yulongnaxizuzizhixian": "玉龙纳西族自治县",
|
||||
"yunlongxian": "云龙县",
|
||||
"yunxian": "云县",
|
||||
"yuxi": "玉溪",
|
||||
"yuxishi": "玉溪",
|
||||
"zhanyiqu": "沾益区",
|
||||
"zhaotong": "昭通",
|
||||
"zhaotongshi": "昭通",
|
||||
"zhaoyangqu": "昭阳区",
|
||||
"zhenkangxian": "镇康县",
|
||||
"zhenxiongxian": "镇雄县",
|
||||
"zhenyuanyizuhanizulahuzuzizhixian": "镇沅彝族哈尼族拉祜族自治县"
|
||||
},
|
||||
"zhejiang": {
|
||||
"anjixian": "安吉县",
|
||||
"beilunqu": "北仑区",
|
||||
"binjiangqu": "滨江区",
|
||||
"cangnanxian": "苍南县",
|
||||
"changshanxian": "常山县",
|
||||
"changxingxian": "长兴县",
|
||||
"chunanxian": "淳安县",
|
||||
"cixi": "慈溪市",
|
||||
"cixishi": "慈溪市",
|
||||
"daishanxian": "岱山县",
|
||||
"deqingxian": "德清县",
|
||||
"dinghaiqu": "定海区",
|
||||
"dongtouqu": "洞头区",
|
||||
"dongyang": "东阳市",
|
||||
"dongyangshi": "东阳市",
|
||||
"fenghuaqu": "奉化区",
|
||||
"fuyangqu": "富阳区",
|
||||
"gongshuqu": "拱墅区",
|
||||
"haining": "海宁市",
|
||||
"hainingshi": "海宁市",
|
||||
"haishuqu": "海曙区",
|
||||
"haiyanxian": "海盐县",
|
||||
"hangzhou": "杭州",
|
||||
"hangzhoushi": "杭州",
|
||||
"huangyanqu": "黄岩区",
|
||||
"huzhou": "湖州",
|
||||
"huzhoushi": "湖州",
|
||||
"jiande": "建德市",
|
||||
"jiandeshi": "建德市",
|
||||
"jiangbeiqu": "江北区",
|
||||
"jiangganqu": "江干区",
|
||||
"jiangshan": "江山市",
|
||||
"jiangshanshi": "江山市",
|
||||
"jiaojiangqu": "椒江区",
|
||||
"jiashanxian": "嘉善县",
|
||||
"jiaxing": "嘉兴",
|
||||
"jiaxingshi": "嘉兴",
|
||||
"jindongqu": "金东区",
|
||||
"jingningshezuzizhixian": "景宁畲族自治县",
|
||||
"jinhua": "金华",
|
||||
"jinhuashi": "金华",
|
||||
"jinyunxian": "缙云县",
|
||||
"kaihuaxian": "开化县",
|
||||
"kechengqu": "柯城区",
|
||||
"keqiaoqu": "柯桥区",
|
||||
"lanxi": "兰溪市",
|
||||
"lanxishi": "兰溪市",
|
||||
"liandouqu": "莲都区",
|
||||
"linanqu": "临安区",
|
||||
"linhai": "临海市",
|
||||
"linhaishi": "临海市",
|
||||
"linpingqu": "临平区",
|
||||
"lishui": "丽水",
|
||||
"lishuishi": "丽水",
|
||||
"longgang": "龙港市",
|
||||
"longgangshi": "龙港市",
|
||||
"longquan": "龙泉市",
|
||||
"longquanshi": "龙泉市",
|
||||
"longwanqu": "龙湾区",
|
||||
"longyouxian": "龙游县",
|
||||
"luchengqu": "鹿城区",
|
||||
"luqiaoqu": "路桥区",
|
||||
"nanhuqu": "南湖区",
|
||||
"nanxunqu": "南浔区",
|
||||
"ningbo": "宁波",
|
||||
"ningboshi": "宁波",
|
||||
"ninghaixian": "宁海县",
|
||||
"ouhaiqu": "瓯海区",
|
||||
"pananxian": "磐安县",
|
||||
"pinghu": "平湖市",
|
||||
"pinghushi": "平湖市",
|
||||
"pingyangxian": "平阳县",
|
||||
"pujiangxian": "浦江县",
|
||||
"putuoqu": "普陀区",
|
||||
"qiantangqu": "钱塘区",
|
||||
"qingtianxian": "青田县",
|
||||
"qingyuanxian": "庆元县",
|
||||
"qujiangqu": "衢江区",
|
||||
"quzhou": "衢州",
|
||||
"quzhoushi": "衢州",
|
||||
"ruian": "瑞安市",
|
||||
"ruianshi": "瑞安市",
|
||||
"sanmenxian": "三门县",
|
||||
"shangchengqu": "上城区",
|
||||
"shangyuqu": "上虞区",
|
||||
"shaoxing": "绍兴",
|
||||
"shaoxingshi": "绍兴",
|
||||
"shengsixian": "嵊泗县",
|
||||
"shengzhou": "嵊州市",
|
||||
"shengzhoushi": "嵊州市",
|
||||
"shixiaqu": "市辖区",
|
||||
"songyangxian": "松阳县",
|
||||
"suichangxian": "遂昌县",
|
||||
"taishunxian": "泰顺县",
|
||||
"taizhou": "台州",
|
||||
"taizhoushi": "台州",
|
||||
"tiantaixian": "天台县",
|
||||
"tongluxian": "桐庐县",
|
||||
"tongxiang": "桐乡市",
|
||||
"tongxiangshi": "桐乡市",
|
||||
"wenchengxian": "文成县",
|
||||
"wenling": "温岭市",
|
||||
"wenlingshi": "温岭市",
|
||||
"wenzhou": "温州",
|
||||
"wenzhoujingjijishukaifaqu": "温州经济技术开发区",
|
||||
"wenzhoushi": "温州",
|
||||
"wuchengqu": "婺城区",
|
||||
"wuxingqu": "吴兴区",
|
||||
"wuyixian": "武义县",
|
||||
"xiachengqu": "下城区",
|
||||
"xiangshanxian": "象山县",
|
||||
"xianjuxian": "仙居县",
|
||||
"xiaoshanqu": "萧山区",
|
||||
"xihuqu": "西湖区",
|
||||
"xinchangxian": "新昌县",
|
||||
"xiuzhouqu": "秀洲区",
|
||||
"yinzhouqu": "鄞州区",
|
||||
"yiwu": "义乌市",
|
||||
"yiwushi": "义乌市",
|
||||
"yongjiaxian": "永嘉县",
|
||||
"yongkang": "永康市",
|
||||
"yongkangshi": "永康市",
|
||||
"yuechengqu": "越城区",
|
||||
"yueqing": "乐清市",
|
||||
"yueqingshi": "乐清市",
|
||||
"yuhangqu": "余杭区",
|
||||
"yuhuan": "玉环市",
|
||||
"yuhuanshi": "玉环市",
|
||||
"yunhexian": "云和县",
|
||||
"yuyao": "余姚市",
|
||||
"yuyaoshi": "余姚市",
|
||||
"zhenhaiqu": "镇海区",
|
||||
"zhoushan": "舟山",
|
||||
"zhoushanshi": "舟山",
|
||||
"zhuji": "诸暨市",
|
||||
"zhujishi": "诸暨市"
|
||||
}
|
||||
},
|
||||
"cityNameByKey": {
|
||||
"abagaqi": "阿巴嘎旗",
|
||||
"abaxian": "阿坝县",
|
||||
"abazangzuqiangzu": "阿坝藏族羌族",
|
||||
"abazangzuqiangzuzizhizhou": "阿坝藏族羌族",
|
||||
"achengqu": "阿城区",
|
||||
"aershan": "阿尔山市",
|
||||
"aershanshi": "阿尔山市",
|
||||
"aheqixian": "阿合奇县",
|
||||
"aihuiqu": "爱辉区",
|
||||
"aiminqu": "爱民区",
|
||||
"akesaihasakezuzizhixian": "阿克塞哈萨克族自治县",
|
||||
"akesudiqu": "阿克苏",
|
||||
"akesushi": "阿克苏市",
|
||||
"aketaoxian": "阿克陶县",
|
||||
"alaer": "阿拉尔市",
|
||||
"alaershi": "阿拉尔市",
|
||||
"alashan": "阿拉善",
|
||||
"alashankou": "阿拉山口市",
|
||||
"alashankoushi": "阿拉山口市",
|
||||
"alashanmeng": "阿拉善",
|
||||
"alashanyouqi": "阿拉善右旗",
|
||||
"alashanzuoqi": "阿拉善左旗",
|
||||
"aleitaidiqu": "阿勒泰",
|
||||
"aleitaishi": "阿勒泰市",
|
||||
"ali": "阿里",
|
||||
"alidiqu": "阿里",
|
||||
"alukeerqinqi": "阿鲁科尔沁旗",
|
||||
"anciqu": "安次区",
|
||||
"anda": "安达市",
|
||||
"andashi": "安达市",
|
||||
"andingqu": "安定区",
|
||||
"anduoxian": "安多县",
|
||||
"anfuxian": "安福县",
|
||||
"angangxiqu": "昂昂溪区",
|
||||
"angrenxian": "昂仁县",
|
||||
"anguo": "安国市",
|
||||
"anguoshi": "安国市",
|
||||
"anhuaxian": "安化县",
|
||||
"anhuianqingjingjikaifaqu": "安徽安庆经济开发区",
|
||||
"anhuiwuhusanshanjingjikaifaqu": "安徽芜湖三山经济开发区",
|
||||
"anjixian": "安吉县",
|
||||
"anjuqu": "安居区",
|
||||
"ankang": "安康",
|
||||
"ankangshi": "安康",
|
||||
"anlongxian": "安龙县",
|
||||
"anlu": "安陆市",
|
||||
"anlushi": "安陆市",
|
||||
"anning": "安宁市",
|
||||
"anningqu": "安宁区",
|
||||
"anningshi": "安宁市",
|
||||
"anpingxian": "安平县",
|
||||
"anqing": "安庆",
|
||||
"anqingshi": "安庆",
|
||||
"anqiu": "安丘市",
|
||||
"anqiushi": "安丘市",
|
||||
"anrenxian": "安仁县",
|
||||
"ansaiqu": "安塞区",
|
||||
"anshan": "鞍山",
|
||||
"anshanshi": "鞍山",
|
||||
"anshun": "安顺",
|
||||
"anshunshi": "安顺",
|
||||
"antuxian": "安图县",
|
||||
"anxiangxian": "安乡县",
|
||||
"anxinxian": "安新县",
|
||||
"anxixian": "安溪县",
|
||||
"anyang": "安阳",
|
||||
"anyanggaoxinjishuchanyekaifaqu": "安阳高新技术产业开发区",
|
||||
"anyangshi": "安阳",
|
||||
"anyangxian": "安阳县",
|
||||
"anyixian": "安义县",
|
||||
"anyuanqu": "安源区",
|
||||
"anyuanxian": "安远县",
|
||||
"anyuexian": "安岳县",
|
||||
"anzexian": "安泽县",
|
||||
"anzhouqu": "安州区",
|
||||
"aohanqi": "敖汉旗",
|
||||
"arongqi": "阿荣旗",
|
||||
"atushen": "阿图什市",
|
||||
"atushenshi": "阿图什市",
|
||||
"awatixian": "阿瓦提县",
|
||||
"babuqu": "八步区",
|
||||
"bachuxian": "巴楚县",
|
||||
"badongxian": "巴东县",
|
||||
"bagongshanqu": "八公山区",
|
||||
"baicheng": "白城",
|
||||
"baichengshi": "白城",
|
||||
"baichengxian": "拜城县",
|
||||
"baihexian": "白河县",
|
||||
"baijiantanqu": "白碱滩区",
|
||||
"bailangxian": "白朗县",
|
||||
"baiquanxian": "拜泉县",
|
||||
"baise": "百色",
|
||||
"baiseshi": "百色",
|
||||
"baishalizuzizhixian": "白沙黎族自治县",
|
||||
"baishan": "白山",
|
||||
"baishanshi": "白山",
|
||||
"baishuixian": "白水县",
|
||||
"baitaqu": "白塔区",
|
||||
"baixiangxian": "柏乡县",
|
||||
"baiyin": "白银",
|
||||
"baiyinqu": "白银区",
|
||||
"baiyinshi": "白银",
|
||||
"baiyunebokuangqu": "白云鄂博矿区",
|
||||
"baiyunqu": "白云区",
|
||||
"baiyuxian": "白玉县",
|
||||
"balikunhasakezizhixian": "巴里坤哈萨克自治县",
|
||||
"balinyouqi": "巴林右旗",
|
||||
"balinzuoqi": "巴林左旗",
|
||||
"bamayaozuzizhixian": "巴马瑶族自治县",
|
||||
"bananqu": "巴南区",
|
||||
"bangexian": "班戈县",
|
||||
"bangshanqu": "蚌山区",
|
||||
"banmaxian": "班玛县",
|
||||
"bao": "宝坻区",
|
||||
"baoanqu": "宝安区",
|
||||
"baodexian": "保德县",
|
||||
"baoding": "保定",
|
||||
"baodingbaigouxincheng": "保定白沟新城",
|
||||
"baodinggaoxinjishuchanyekaifaqu": "保定高新技术产业开发区",
|
||||
"baodingshi": "保定",
|
||||
"baodiqu": "宝坻区",
|
||||
"baofengxian": "宝丰县",
|
||||
"baohequ": "包河区",
|
||||
"baoji": "宝鸡",
|
||||
"baojingxian": "保靖县",
|
||||
"baojishi": "宝鸡",
|
||||
"baokangxian": "保康县",
|
||||
"baoqingxian": "宝清县",
|
||||
"baoshan": "保山",
|
||||
"baoshanqu": "宝山区",
|
||||
"baoshanshi": "保山",
|
||||
"baotaqu": "宝塔区",
|
||||
"baotinglizumiaozuzizhixian": "保亭黎族苗族自治县",
|
||||
"baotou": "包头",
|
||||
"baotoushi": "包头",
|
||||
"baotouxitugaoxinjishuchanyekaifaqu": "包头稀土高新技术产业开发区",
|
||||
"baoxingxian": "宝兴县",
|
||||
"baoyingxian": "宝应县",
|
||||
"baqiaoqu": "灞桥区",
|
||||
"baqingxian": "巴青县",
|
||||
"basuxian": "八宿县",
|
||||
"batangxian": "巴塘县",
|
||||
"bayannaoer": "巴彦淖尔",
|
||||
"bayannaoershi": "巴彦淖尔",
|
||||
"bayanxian": "巴彦县",
|
||||
"bayinguolengmenggu": "巴音郭楞蒙古",
|
||||
"bayinguolengmengguzizhizhou": "巴音郭楞蒙古",
|
||||
"bayiqu": "巴宜区",
|
||||
"bayuquanqu": "鲅鱼圈区",
|
||||
"bazhong": "巴中",
|
||||
"bazhongjingjikaifaqu": "巴中经济开发区",
|
||||
"bazhongshi": "巴中",
|
||||
"bazhou": "霸州市",
|
||||
"bazhouqu": "巴州区",
|
||||
"bazhoushi": "霸州市",
|
||||
"beian": "北安市",
|
||||
"beianshi": "北安市",
|
||||
"beibeiqu": "北碚区",
|
||||
"beichenqu": "北辰区",
|
||||
"beichuanqiangzuzizhixian": "北川羌族自治县",
|
||||
"beidaihequ": "北戴河区",
|
||||
"beidaihexinqu": "北戴河新区",
|
||||
"beiguanqu": "北关区",
|
||||
"beihai": "北海",
|
||||
"beihaishi": "北海",
|
||||
"beihuqu": "北湖区",
|
||||
"beiliu": "北流市",
|
||||
"beiliushi": "北流市",
|
||||
"beilunqu": "北仑区",
|
||||
"beipiao": "北票市",
|
||||
"beipiaoshi": "北票市",
|
||||
"beiqu": "北区",
|
||||
"beitaqu": "北塔区",
|
||||
"beitun": "北屯市",
|
||||
"beitunshi": "北屯市",
|
||||
"beizhen": "北镇市",
|
||||
"beizhenshi": "北镇市",
|
||||
"bengbu": "蚌埠",
|
||||
"bengbushi": "蚌埠",
|
||||
"bengbushigaoxinjishukaifaqu": "蚌埠市高新技术开发区",
|
||||
"bengbushijingjikaifaqu": "蚌埠市经济开发区",
|
||||
"benxi": "本溪",
|
||||
"benximanzuzizhixian": "本溪满族自治县",
|
||||
"benxishi": "本溪",
|
||||
"bianbaxian": "边坝县",
|
||||
"bijiangqu": "碧江区",
|
||||
"bijie": "毕节",
|
||||
"bijieshi": "毕节",
|
||||
"binchengqu": "滨城区",
|
||||
"binchuanxian": "宾川县",
|
||||
"binhaixian": "滨海县",
|
||||
"binhaixinqu": "滨海新区",
|
||||
"binhuqu": "滨湖区",
|
||||
"binjiangqu": "滨江区",
|
||||
"binxian": "宾县",
|
||||
"binyangxian": "宾阳县",
|
||||
"biruxian": "比如县",
|
||||
"bishanqu": "璧山区",
|
||||
"biyangxian": "泌阳县",
|
||||
"boaixian": "博爱县",
|
||||
"bobaixian": "博白县",
|
||||
"boertalamenggu": "博尔塔拉蒙古",
|
||||
"boertalamengguzizhizhou": "博尔塔拉蒙古",
|
||||
"bohuxian": "博湖县",
|
||||
"bole": "博乐市",
|
||||
"boleshi": "博乐市",
|
||||
"bolixian": "勃利县",
|
||||
"boluoxian": "博罗县",
|
||||
"bomixian": "波密县",
|
||||
"boshanqu": "博山区",
|
||||
"bowangqu": "博望区",
|
||||
"boxingxian": "博兴县",
|
||||
"boyexian": "博野县",
|
||||
"bozhou": "亳州",
|
||||
"bozhouqu": "播州区",
|
||||
"bozhoushi": "亳州",
|
||||
"buerjinxian": "布尔津县",
|
||||
"butuoxian": "布拖县",
|
||||
"caidianqu": "蔡甸区",
|
||||
"cangnanxian": "苍南县",
|
||||
"cangshanqu": "仓山区",
|
||||
"cangwuxian": "苍梧县",
|
||||
"cangxian": "沧县",
|
||||
"cangxixian": "苍溪县",
|
||||
"cangyuanwazuzizhixian": "沧源佤族自治县",
|
||||
"cangzhou": "沧州",
|
||||
"cangzhoubohaixinqu": "沧州渤海新区",
|
||||
"cangzhougaoxinjishuchanyekaifaqu": "沧州高新技术产业开发区",
|
||||
"cangzhoushi": "沧州",
|
||||
"caofeidianqu": "曹妃甸区",
|
||||
"caoxian": "曹县",
|
||||
"cehengxian": "册亨县",
|
||||
"celeixian": "策勒县",
|
||||
"cengdouqu": "曾都区",
|
||||
"cengongxian": "岑巩县",
|
||||
"cenxi": "岑溪市",
|
||||
"cenxishi": "岑溪市",
|
||||
"chabuchaerxibozizhixian": "察布查尔锡伯自治县",
|
||||
"chahaeryouyihouqi": "察哈尔右翼后旗",
|
||||
"chahaeryouyiqianqi": "察哈尔右翼前旗",
|
||||
"chahaeryouyizhongqi": "察哈尔右翼中旗",
|
||||
"chaisangqu": "柴桑区",
|
||||
"chalingxian": "茶陵县",
|
||||
"chanchengqu": "禅城区",
|
||||
"changanqu": "长安区",
|
||||
"changchun": "长春",
|
||||
"changchungaoxinjishuchanyekaifaqu": "长春高新技术产业开发区",
|
||||
"changchunjingjijishukaifaqu": "长春经济技术开发区",
|
||||
"changchunjingyuegaoxinjishuchanyekaifaqu": "长春净月高新技术产业开发区",
|
||||
"changchunqichejingjijishukaifaqu": "长春汽车经济技术开发区",
|
||||
"changchunshi": "长春",
|
||||
"changde": "常德",
|
||||
"changdeshi": "常德",
|
||||
"changdeshixidongtingguanliqu": "常德市西洞庭管理区",
|
||||
"changdou": "昌都",
|
||||
"changdu": "昌都",
|
||||
"changdushi": "昌都",
|
||||
"changji": "昌吉市",
|
||||
"changjianglizuzizhixian": "昌江黎族自治县",
|
||||
"changjiangqu": "昌江区",
|
||||
"changjihuizu": "昌吉回族",
|
||||
"changjihuizuzizhizhou": "昌吉回族",
|
||||
"changjishi": "昌吉市",
|
||||
"changlequ": "长乐区",
|
||||
"changlexian": "昌乐县",
|
||||
"changlixian": "昌黎县",
|
||||
"changning": "常宁市",
|
||||
"changningshi": "常宁市",
|
||||
"changningxian": "昌宁县",
|
||||
"changpingqu": "昌平区",
|
||||
"changsha": "长沙",
|
||||
"changshanxian": "常山县",
|
||||
"changshashi": "长沙",
|
||||
"changshaxian": "长沙县",
|
||||
"changshouqu": "长寿区",
|
||||
"changshu": "常熟市",
|
||||
"changshushi": "常熟市",
|
||||
"changtingxian": "长汀县",
|
||||
"changtuxian": "昌图县",
|
||||
"changxingxian": "长兴县",
|
||||
"changyi": "昌邑市",
|
||||
"changyiqu": "昌邑区",
|
||||
"changyishi": "昌邑市",
|
||||
"changzhou": "常州",
|
||||
"changzhoushi": "常州",
|
||||
"chanhehuizuqu": "瀍河回族区",
|
||||
"chaoanqu": "潮安区",
|
||||
"chaohu": "巢湖市",
|
||||
"chaohushi": "巢湖市",
|
||||
"chaonanqu": "潮南区",
|
||||
"chaotianqu": "朝天区",
|
||||
"chaozhou": "潮州",
|
||||
"chaozhoushi": "潮州",
|
||||
"chayaxian": "察雅县",
|
||||
"chayuxian": "察隅县",
|
||||
"chenbaerhuqi": "陈巴尔虎旗",
|
||||
"chencangqu": "陈仓区",
|
||||
"chenganxian": "成安县",
|
||||
"chengbeiqu": "城北区",
|
||||
"chengbumiaozuzizhixian": "城步苗族自治县",
|
||||
"chengchengxian": "澄城县",
|
||||
"chengde": "承德",
|
||||
"chengdegaoxinjishuchanyekaifaqu": "承德高新技术产业开发区",
|
||||
"chengdeshi": "承德",
|
||||
"chengdexian": "承德县",
|
||||
"chengdongqu": "城东区",
|
||||
"chengdu": "成都",
|
||||
"chengduoxian": "称多县",
|
||||
"chengdushi": "成都",
|
||||
"chenggongqu": "呈贡区",
|
||||
"chengguanqu": "城关区",
|
||||
"chengguxian": "城固县",
|
||||
"chenghaiqu": "澄海区",
|
||||
"chenghuaqu": "成华区",
|
||||
"chengjiang": "澄江市",
|
||||
"chengjiangshi": "澄江市",
|
||||
"chengkouxian": "城口县",
|
||||
"chengmaixian": "澄迈县",
|
||||
"chengqu": "城区",
|
||||
"chengwuxian": "成武县",
|
||||
"chengxian": "成县",
|
||||
"chengxiangqu": "城厢区",
|
||||
"chengxiqu": "城西区",
|
||||
"chengyangqu": "城阳区",
|
||||
"chengzhongqu": "城中区",
|
||||
"chengzihequ": "城子河区",
|
||||
"chenxixian": "辰溪县",
|
||||
"chenzhou": "郴州",
|
||||
"chenzhoushi": "郴州",
|
||||
"chibi": "赤壁市",
|
||||
"chibishi": "赤壁市",
|
||||
"chichengxian": "赤城县",
|
||||
"chifeng": "赤峰",
|
||||
"chifengshi": "赤峰",
|
||||
"chikanqu": "赤坎区",
|
||||
"chipingqu": "茌平区",
|
||||
"chishui": "赤水市",
|
||||
"chishuishi": "赤水市",
|
||||
"chizhou": "池州",
|
||||
"chizhoushi": "池州",
|
||||
"chongchuanqu": "崇川区",
|
||||
"chongliqu": "崇礼区",
|
||||
"chongmingqu": "崇明区",
|
||||
"chongrenxian": "崇仁县",
|
||||
"chongxinxian": "崇信县",
|
||||
"chongyangxian": "崇阳县",
|
||||
"chongyixian": "崇义县",
|
||||
"chongzhou": "崇州市",
|
||||
"chongzhoushi": "崇州市",
|
||||
"chongzuo": "崇左",
|
||||
"chongzuoshi": "崇左",
|
||||
"chuanhuiqu": "川汇区",
|
||||
"chuanshanqu": "船山区",
|
||||
"chuanyingqu": "船营区",
|
||||
"chunanxian": "淳安县",
|
||||
"chunhuaxian": "淳化县",
|
||||
"chuxiong": "楚雄市",
|
||||
"chuxiongshi": "楚雄市",
|
||||
"chuxiongyizu": "楚雄彝族",
|
||||
"chuxiongyizuzizhizhou": "楚雄彝族",
|
||||
"chuzhou": "滁州",
|
||||
"chuzhoujingjijishukaifaqu": "滁州经济技术开发区",
|
||||
"chuzhoushi": "滁州",
|
||||
"cilixian": "慈利县",
|
||||
"cixi": "慈溪市",
|
||||
"cixian": "磁县",
|
||||
"cixishi": "慈溪市",
|
||||
"conghuaqu": "从化区",
|
||||
"congjiangxian": "从江县",
|
||||
"congtaiqu": "丛台区",
|
||||
"cuipingqu": "翠屏区",
|
||||
"cuomeixian": "措美县",
|
||||
"cuonaxian": "错那县",
|
||||
"cuoqinxian": "措勤县",
|
||||
"daan": "大安市",
|
||||
"daanqu": "大安区",
|
||||
"daanshi": "大安市",
|
||||
"dabanchengqu": "达坂城区",
|
||||
"dabuqu": "大埔区",
|
||||
"dabuxian": "大埔县",
|
||||
"dachaidanxingzhengweiyuanhui": "大柴旦行政委员会",
|
||||
"dachanghuizuzizhixian": "大厂回族自治县",
|
||||
"dachengxian": "大城县",
|
||||
"dachuanqu": "达川区",
|
||||
"dadongqu": "大东区",
|
||||
"dadukouqu": "大渡口区",
|
||||
"daerhanmaominganlianheqi": "达尔罕茂明安联合旗",
|
||||
"dafangxian": "大方县",
|
||||
"dafengqu": "大丰区",
|
||||
"daguanqu": "大观区",
|
||||
"daguanxian": "大关县",
|
||||
"dahuayaozuzizhixian": "大化瑶族自治县",
|
||||
"daishanxian": "岱山县",
|
||||
"daixian": "代县",
|
||||
"daiyuequ": "岱岳区",
|
||||
"dalateqi": "达拉特旗",
|
||||
"dali": "大理市",
|
||||
"dalian": "大连",
|
||||
"dalianshi": "大连",
|
||||
"dalibaizu": "大理白族",
|
||||
"dalibaizuzizhizhou": "大理白族",
|
||||
"dalishi": "大理市",
|
||||
"dalixian": "大荔县",
|
||||
"damingxian": "大名县",
|
||||
"danbaxian": "丹巴县",
|
||||
"danchengxian": "郸城县",
|
||||
"dandong": "丹东",
|
||||
"dandongshi": "丹东",
|
||||
"danfengxian": "丹凤县",
|
||||
"dangchangxian": "宕昌县",
|
||||
"dangshanxian": "砀山县",
|
||||
"dangtuxian": "当涂县",
|
||||
"dangxiongxian": "当雄县",
|
||||
"dangyang": "当阳市",
|
||||
"dangyangshi": "当阳市",
|
||||
"daningxian": "大宁县",
|
||||
"danjiangkou": "丹江口市",
|
||||
"danjiangkoushi": "丹江口市",
|
||||
"danlengxian": "丹棱县",
|
||||
"dantuqu": "丹徒区",
|
||||
"danxian": "单县",
|
||||
"danyang": "丹阳市",
|
||||
"danyangshi": "丹阳市",
|
||||
"danzhaixian": "丹寨县",
|
||||
"danzhou": "儋州",
|
||||
"danzhoushi": "儋州",
|
||||
"daochengxian": "稻城县",
|
||||
"daofuxian": "道孚县",
|
||||
"daoliqu": "道里区",
|
||||
"daowaiqu": "道外区",
|
||||
"daoxian": "道县",
|
||||
"daozhengelaozumiaozuzizhixian": "道真仡佬族苗族自治县",
|
||||
"daqing": "大庆",
|
||||
"daqinggaoxinjishuchanyekaifaqu": "大庆高新技术产业开发区",
|
||||
"daqingshanxian": "大箐山县",
|
||||
"daqingshi": "大庆",
|
||||
"darixian": "达日县",
|
||||
"dashiqiao": "大石桥市",
|
||||
"dashiqiaoshi": "大石桥市",
|
||||
"datangqu": "大堂区",
|
||||
"datianxian": "大田县",
|
||||
"datong": "大同",
|
||||
"datonghuizutuzuzizhixian": "大通回族土族自治县",
|
||||
"datongshi": "大同",
|
||||
"dawaqu": "大洼区",
|
||||
"dawukouqu": "大武口区",
|
||||
"dawuxian": "大悟县",
|
||||
"daxiangqu": "大祥区",
|
||||
"daxinganling": "大兴安岭",
|
||||
"daxinganlingdiqu": "大兴安岭",
|
||||
"daxingqu": "大兴区",
|
||||
"daxinxian": "大新县",
|
||||
"dayaoxian": "大姚县",
|
||||
"daye": "大冶市",
|
||||
"dayeshi": "大冶市",
|
||||
"dayingxian": "大英县",
|
||||
"dayixian": "大邑县",
|
||||
"dayuxian": "大余县",
|
||||
"dazhou": "达州",
|
||||
"dazhoujingjikaifaqu": "达州经济开发区",
|
||||
"dazhoushi": "达州",
|
||||
"dazhuxian": "大竹县",
|
||||
"dazigongyeyuanqu": "达孜工业园区",
|
||||
"daziqu": "达孜区",
|
||||
"dazuqu": "大足区",
|
||||
"deanxian": "德安县",
|
||||
"debaoxian": "德保县",
|
||||
"dechangxian": "德昌县",
|
||||
"dechengqu": "德城区",
|
||||
"degexian": "德格县",
|
||||
"dehongdaizujingpozu": "德宏傣族景颇族",
|
||||
"dehongdaizujingpozuzizhizhou": "德宏傣族景颇族",
|
||||
"dehuaxian": "德化县",
|
||||
"dehui": "德惠市",
|
||||
"dehuishi": "德惠市",
|
||||
"dejiangxian": "德江县",
|
||||
"delingha": "德令哈市",
|
||||
"delinghashi": "德令哈市",
|
||||
"dengfeng": "登封市",
|
||||
"dengfengshi": "登封市",
|
||||
"dengkouxian": "磴口县",
|
||||
"dengta": "灯塔市",
|
||||
"dengtashi": "灯塔市",
|
||||
"dengzhou": "邓州市",
|
||||
"dengzhoushi": "邓州市",
|
||||
"deqinxian": "德钦县",
|
||||
"derongxian": "得荣县",
|
||||
"dexing": "德兴市",
|
||||
"dexingshi": "德兴市",
|
||||
"deyang": "德阳",
|
||||
"deyangshi": "德阳",
|
||||
"dezhou": "德州",
|
||||
"dezhoujingjijishukaifaqu": "德州经济技术开发区",
|
||||
"dezhoushi": "德州",
|
||||
"dezhouyunhejingjikaifaqu": "德州运河经济开发区",
|
||||
"dianbaiqu": "电白区",
|
||||
"dianjiangxian": "垫江县",
|
||||
"dianjunqu": "点军区",
|
||||
"diaobingshan": "调兵山市",
|
||||
"diaobingshanshi": "调兵山市",
|
||||
"didaoqu": "滴道区",
|
||||
"diebuxian": "迭部县",
|
||||
"diecaiqu": "叠彩区",
|
||||
"dinganxian": "定安县",
|
||||
"dingbianxian": "定边县",
|
||||
"dingchengqu": "鼎城区",
|
||||
"dinghaiqu": "定海区",
|
||||
"dinghuqu": "鼎湖区",
|
||||
"dingjiexian": "定结县",
|
||||
"dingnanxian": "定南县",
|
||||
"dingqingxian": "丁青县",
|
||||
"dingrixian": "定日县",
|
||||
"dingtaoqu": "定陶区",
|
||||
"dingxi": "定西",
|
||||
"dingxiangxian": "定襄县",
|
||||
"dingxingxian": "定兴县",
|
||||
"dingxishi": "定西",
|
||||
"dingyuanxian": "定远县",
|
||||
"dingzhou": "定州市",
|
||||
"dingzhoushi": "定州市",
|
||||
"diqingzangzu": "迪庆藏族",
|
||||
"diqingzangzuzizhizhou": "迪庆藏族",
|
||||
"donganqu": "东安区",
|
||||
"donganxian": "东安县",
|
||||
"dongbaoqu": "东宝区",
|
||||
"dongchangfuqu": "东昌府区",
|
||||
"dongchangqu": "东昌区",
|
||||
"dongchengqu": "东城区",
|
||||
"dongchuanqu": "东川区",
|
||||
"dongexian": "东阿县",
|
||||
"dongfang": "东方市",
|
||||
"dongfangshi": "东方市",
|
||||
"dongfengqu": "东风区",
|
||||
"dongfengxian": "东丰县",
|
||||
"donggang": "东港市",
|
||||
"donggangqu": "东港区",
|
||||
"donggangshi": "东港市",
|
||||
"dongguan": "东莞",
|
||||
"dongguangxian": "东光县",
|
||||
"dongguanshi": "东莞",
|
||||
"donghaixian": "东海县",
|
||||
"donghequ": "东河区",
|
||||
"donghuqu": "东湖区",
|
||||
"dongkouxian": "洞口县",
|
||||
"donglanxian": "东兰县",
|
||||
"dongliaoxian": "东辽县",
|
||||
"dongliqu": "东丽区",
|
||||
"dongmingxian": "东明县",
|
||||
"dongning": "东宁市",
|
||||
"dongningshi": "东宁市",
|
||||
"dongpingxian": "东平县",
|
||||
"dongpoqu": "东坡区",
|
||||
"dongqu": "东区",
|
||||
"dongshanqu": "东山区",
|
||||
"dongshanxian": "东山县",
|
||||
"dongshengqu": "东胜区",
|
||||
"dongtai": "东台市",
|
||||
"dongtaishi": "东台市",
|
||||
"dongtouqu": "洞头区",
|
||||
"dongwuzhumuqinqi": "东乌珠穆沁旗",
|
||||
"dongxiangqu": "东乡区",
|
||||
"dongxiangzuzizhixian": "东乡族自治县",
|
||||
"dongxihuqu": "东西湖区",
|
||||
"dongxing": "东兴市",
|
||||
"dongxingqu": "东兴区",
|
||||
"dongxingshi": "东兴市",
|
||||
"dongyang": "东阳市",
|
||||
"dongyangshi": "东阳市",
|
||||
"dongying": "东营",
|
||||
"dongyinggangjingjikaifaqu": "东营港经济开发区",
|
||||
"dongyingjingjijishukaifaqu": "东营经济技术开发区",
|
||||
"dongyingqu": "东营区",
|
||||
"dongyingshi": "东营",
|
||||
"dongyuanxian": "东源县",
|
||||
"dongzhixian": "东至县",
|
||||
"dongzhouqu": "东洲区",
|
||||
"douanyaozuzizhixian": "都安瑶族自治县",
|
||||
"douchangxian": "都昌县",
|
||||
"doulanxian": "都兰县",
|
||||
"doumenqu": "斗门区",
|
||||
"douyun": "都匀市",
|
||||
"douyunshi": "都匀市",
|
||||
"duanzhouqu": "端州区",
|
||||
"duerbotemengguzuzizhixian": "杜尔伯特蒙古族自治县",
|
||||
"duilongdeqingqu": "堆龙德庆区",
|
||||
"dujiangyan": "都江堰市",
|
||||
"dujiangyanshi": "都江堰市",
|
||||
"dujiqu": "杜集区",
|
||||
"dunhua": "敦化市",
|
||||
"dunhuang": "敦煌市",
|
||||
"dunhuangshi": "敦煌市",
|
||||
"dunhuashi": "敦化市",
|
||||
"duodaoqu": "掇刀区",
|
||||
"duolunxian": "多伦县",
|
||||
"dushanxian": "独山县",
|
||||
"dushanziqu": "独山子区",
|
||||
"ebianyizuzizhixian": "峨边彝族自治县",
|
||||
"echengqu": "鄂城区",
|
||||
"eerduosi": "鄂尔多斯",
|
||||
"eerduosishi": "鄂尔多斯",
|
||||
"eerguna": "额尔古纳市",
|
||||
"eergunashi": "额尔古纳市",
|
||||
"ejinaqi": "额济纳旗",
|
||||
"elunchunzizhiqi": "鄂伦春自治旗",
|
||||
"emeishan": "峨眉山市",
|
||||
"emeishanshi": "峨眉山市",
|
||||
"eminxian": "额敏县",
|
||||
"enping": "恩平市",
|
||||
"enpingshi": "恩平市",
|
||||
"enshi": "恩施市",
|
||||
"enshishi": "恩施市",
|
||||
"enshitujiazumiaozu": "恩施土家族苗族",
|
||||
"enshitujiazumiaozuzizhizhou": "恩施土家族苗族",
|
||||
"enyangqu": "恩阳区",
|
||||
"erdaojiangqu": "二道江区",
|
||||
"erdaoqu": "二道区",
|
||||
"erlianhaote": "二连浩特市",
|
||||
"erlianhaoteshi": "二连浩特市",
|
||||
"erqiqu": "二七区",
|
||||
"eryuanxian": "洱源县",
|
||||
"eshanyizuzizhixian": "峨山彝族自治县",
|
||||
"etuokeqi": "鄂托克旗",
|
||||
"etuokeqianqi": "鄂托克前旗",
|
||||
"ewenkezuzizhiqi": "鄂温克族自治旗",
|
||||
"ezhou": "鄂州",
|
||||
"ezhoushi": "鄂州",
|
||||
"fakuxian": "法库县",
|
||||
"fanchangqu": "繁昌区",
|
||||
"fanchengqu": "樊城区",
|
||||
"fangchenggang": "防城港",
|
||||
"fangchenggangshi": "防城港",
|
||||
"fangchengqu": "防城区",
|
||||
"fangchengxian": "方城县",
|
||||
"fangshanqu": "房山区",
|
||||
"fangshanxian": "方山县",
|
||||
"fangxian": "房县",
|
||||
"fangzhengxian": "方正县",
|
||||
"fangziqu": "坊子区",
|
||||
"fanxian": "范县",
|
||||
"fanzhixian": "繁峙县",
|
||||
"feicheng": "肥城市",
|
||||
"feichengshi": "肥城市",
|
||||
"feidongxian": "肥东县",
|
||||
"feixian": "费县",
|
||||
"feixiangqu": "肥乡区",
|
||||
"feixixian": "肥西县",
|
||||
"fengdouxian": "丰都县",
|
||||
"fengfengkuangqu": "峰峰矿区",
|
||||
"fenggangxian": "凤冈县",
|
||||
"fenghuangxian": "凤凰县",
|
||||
"fenghuaqu": "奉化区",
|
||||
"fengjiexian": "奉节县",
|
||||
"fengkaixian": "封开县",
|
||||
"fenglinxian": "丰林县",
|
||||
"fengmanqu": "丰满区",
|
||||
"fengnanqu": "丰南区",
|
||||
"fengningmanzuzizhixian": "丰宁满族自治县",
|
||||
"fengqingxian": "凤庆县",
|
||||
"fengqiuxian": "封丘县",
|
||||
"fengquanqu": "凤泉区",
|
||||
"fengrunqu": "丰润区",
|
||||
"fengshanxian": "凤山县",
|
||||
"fengshuntangqu": "风顺堂区",
|
||||
"fengshunxian": "丰顺县",
|
||||
"fengtaiqu": "丰台区",
|
||||
"fengtaixian": "凤台县",
|
||||
"fengxiangqu": "凤翔区",
|
||||
"fengxiangxian": "凤翔县",
|
||||
"fengxianqu": "奉贤区",
|
||||
"fengxinxian": "奉新县",
|
||||
"fengyangxian": "凤阳县",
|
||||
"fengzequ": "丰泽区",
|
||||
"fengzhen": "丰镇市",
|
||||
"fengzhenshi": "丰镇市",
|
||||
"fenxixian": "汾西县",
|
||||
"fenyang": "汾阳市",
|
||||
"fenyangshi": "汾阳市",
|
||||
"fenyixian": "分宜县",
|
||||
"foshan": "佛山",
|
||||
"foshanshi": "佛山",
|
||||
"fuan": "福安市",
|
||||
"fuanshi": "福安市",
|
||||
"fuchengqu": "涪城区",
|
||||
"fuchengxian": "阜城县",
|
||||
"fuchuanyaozuzizhixian": "富川瑶族自治县",
|
||||
"fuding": "福鼎市",
|
||||
"fudingshi": "福鼎市",
|
||||
"fufengxian": "扶风县",
|
||||
"fugangxian": "佛冈县",
|
||||
"fugongxian": "福贡县",
|
||||
"fugouxian": "扶沟县",
|
||||
"fuguxian": "府谷县",
|
||||
"fuhaixian": "福海县",
|
||||
"fujin": "富锦市",
|
||||
"fujinshi": "富锦市",
|
||||
"fukang": "阜康市",
|
||||
"fukangshi": "阜康市",
|
||||
"fulaerjiqu": "富拉尔基区",
|
||||
"fuliangxian": "浮梁县",
|
||||
"fulingqu": "涪陵区",
|
||||
"fumianqu": "福绵区",
|
||||
"fuminxian": "富民县",
|
||||
"funanxian": "阜南县",
|
||||
"funingqu": "抚宁区",
|
||||
"fuqing": "福清市",
|
||||
"fuqingshi": "福清市",
|
||||
"fuquan": "福泉市",
|
||||
"fuquanshi": "福泉市",
|
||||
"furongqu": "芙蓉区",
|
||||
"fushanqu": "福山区",
|
||||
"fushanxian": "浮山县",
|
||||
"fushun": "抚顺",
|
||||
"fushunshi": "抚顺",
|
||||
"fusongxian": "抚松县",
|
||||
"fusuixian": "扶绥县",
|
||||
"futianqu": "福田区",
|
||||
"fuxian": "富县",
|
||||
"fuxin": "阜新",
|
||||
"fuxingqu": "复兴区",
|
||||
"fuxinmengguzuzizhixian": "阜新蒙古族自治县",
|
||||
"fuxinshi": "阜新",
|
||||
"fuyang": "阜阳",
|
||||
"fuyanghefeixiandaichanyeyuanqu": "阜阳合肥现代产业园区",
|
||||
"fuyangjingjijishukaifaqu": "阜阳经济技术开发区",
|
||||
"fuyangqu": "富阳区",
|
||||
"fuyangshi": "阜阳",
|
||||
"fuyu": "扶余市",
|
||||
"fuyuan": "抚远市",
|
||||
"fuyuanshi": "抚远市",
|
||||
"fuyuanxian": "富源县",
|
||||
"fuyunxian": "富蕴县",
|
||||
"fuyushi": "扶余市",
|
||||
"fuyuxian": "富裕县",
|
||||
"gaerxian": "噶尔县",
|
||||
"gaizexian": "改则县",
|
||||
"gaizhou": "盖州市",
|
||||
"gaizhoushi": "盖州市",
|
||||
"gandexian": "甘德县",
|
||||
"gangbaxian": "岗巴县",
|
||||
"gangbeiqu": "港北区",
|
||||
"gangchaxian": "刚察县",
|
||||
"gangchengqu": "钢城区",
|
||||
"gangkouqu": "港口区",
|
||||
"gangnanqu": "港南区",
|
||||
"ganguxian": "甘谷县",
|
||||
"ganjingziqu": "甘井子区",
|
||||
"ganluoxian": "甘洛县",
|
||||
"gannanxian": "甘南县",
|
||||
"gannanzangzu": "甘南藏族",
|
||||
"gannanzangzuzizhizhou": "甘南藏族",
|
||||
"ganquanxian": "甘泉县",
|
||||
"ganxianqu": "赣县区",
|
||||
"ganyuqu": "赣榆区",
|
||||
"ganzhou": "赣州",
|
||||
"ganzhouqu": "甘州区",
|
||||
"ganzhoushi": "赣州",
|
||||
"ganzixian": "甘孜县",
|
||||
"ganzizangzu": "甘孜藏族",
|
||||
"ganzizangzuzizhizhou": "甘孜藏族",
|
||||
"gaoan": "高安市",
|
||||
"gaoanshi": "高安市",
|
||||
"gaobeidian": "高碑店市",
|
||||
"gaobeidianshi": "高碑店市",
|
||||
"gaochangqu": "高昌区",
|
||||
"gaochengqu": "藁城区",
|
||||
"gaochunqu": "高淳区",
|
||||
"gaogangqu": "高港区",
|
||||
"gaolanxian": "皋兰县",
|
||||
"gaolingqu": "高陵区",
|
||||
"gaomi": "高密市",
|
||||
"gaomingqu": "高明区",
|
||||
"gaomishi": "高密市",
|
||||
"gaoping": "高平市",
|
||||
"gaopingqu": "高坪区",
|
||||
"gaopingshi": "高平市",
|
||||
"gaoqingxian": "高青县",
|
||||
"gaotaixian": "高台县",
|
||||
"gaotangxian": "高唐县",
|
||||
"gaoxian": "高县",
|
||||
"gaoyangxian": "高阳县",
|
||||
"gaoyaoqu": "高要区",
|
||||
"gaoyixian": "高邑县",
|
||||
"gaoyou": "高邮市",
|
||||
"gaoyoushi": "高邮市",
|
||||
"gaozhou": "高州市",
|
||||
"gaozhoushi": "高州市",
|
||||
"gashixian": "伽师县",
|
||||
"geermu": "格尔木市",
|
||||
"geermushi": "格尔木市",
|
||||
"geermuzangqinggongyeyuanqu": "格尔木藏青工业园区",
|
||||
"gejiu": "个旧市",
|
||||
"gejiushi": "个旧市",
|
||||
"gejixian": "革吉县",
|
||||
"gengmadaizuwazuzizhixian": "耿马傣族佤族自治县",
|
||||
"genhe": "根河市",
|
||||
"genheshi": "根河市",
|
||||
"gonganxian": "公安县",
|
||||
"gongbujiangdaxian": "工布江达县",
|
||||
"gongchengyaozuzizhixian": "恭城瑶族自治县",
|
||||
"gonggaxian": "贡嘎县",
|
||||
"gonghexian": "共和县",
|
||||
"gongjingqu": "贡井区",
|
||||
"gongjuexian": "贡觉县",
|
||||
"gongliuxian": "巩留县",
|
||||
"gongnongqu": "工农区",
|
||||
"gongqingcheng": "共青城市",
|
||||
"gongqingchengshi": "共青城市",
|
||||
"gongshandulongzunuzuzizhixian": "贡山独龙族怒族自治县",
|
||||
"gongshuqu": "拱墅区",
|
||||
"gongxian": "珙县",
|
||||
"gongyi": "巩义市",
|
||||
"gongyishi": "巩义市",
|
||||
"gongzhanglingqu": "弓长岭区",
|
||||
"gongzhuling": "公主岭市",
|
||||
"gongzhulingshi": "公主岭市",
|
||||
"guanchenghuizuqu": "管城回族区",
|
||||
"guanduqu": "官渡区",
|
||||
"guangan": "广安",
|
||||
"guanganqu": "广安区",
|
||||
"guanganshi": "广安",
|
||||
"guangchangxian": "广昌县",
|
||||
"guangde": "广德市",
|
||||
"guangdeshi": "广德市",
|
||||
"guangfengqu": "广丰区",
|
||||
"guanghan": "广汉市",
|
||||
"guanghanshi": "广汉市",
|
||||
"guanghexian": "广河县",
|
||||
"guanglingqu": "广陵区",
|
||||
"guanglingxian": "广灵县",
|
||||
"guangmingqu": "光明区",
|
||||
"guangnanxian": "广南县",
|
||||
"guangningxian": "广宁县",
|
||||
"guangpingxian": "广平县",
|
||||
"guangraoxian": "广饶县",
|
||||
"guangshanxian": "光山县",
|
||||
"guangshui": "广水市",
|
||||
"guangshuishi": "广水市",
|
||||
"guangxinqu": "广信区",
|
||||
"guangyangqu": "广阳区",
|
||||
"guangyuan": "广元",
|
||||
"guangyuanshi": "广元",
|
||||
"guangzexian": "光泽县",
|
||||
"guangzhou": "广州",
|
||||
"guangzhoushi": "广州",
|
||||
"guangzongxian": "广宗县",
|
||||
"guanlingbuyizumiaozuzizhixian": "关岭布依族苗族自治县",
|
||||
"guannanxian": "灌南县",
|
||||
"guanshanhuqu": "观山湖区",
|
||||
"guantangqu": "观塘区",
|
||||
"guantaoxian": "馆陶县",
|
||||
"guanyangxian": "灌阳县",
|
||||
"guanyunxian": "灌云县",
|
||||
"guazhouxian": "瓜州县",
|
||||
"guchengqu": "古城区",
|
||||
"guichiqu": "贵池区",
|
||||
"guidexian": "贵德县",
|
||||
"guidingxian": "贵定县",
|
||||
"guidongxian": "桂东县",
|
||||
"guigang": "贵港",
|
||||
"guigangshi": "贵港",
|
||||
"guilin": "桂林",
|
||||
"guilinshi": "桂林",
|
||||
"guinanxian": "贵南县",
|
||||
"guiping": "桂平市",
|
||||
"guipingshi": "桂平市",
|
||||
"guixi": "贵溪市",
|
||||
"guixishi": "贵溪市",
|
||||
"guiyang": "贵阳",
|
||||
"guiyangshi": "贵阳",
|
||||
"guiyangxian": "桂阳县",
|
||||
"gujiao": "古交市",
|
||||
"gujiaoshi": "古交市",
|
||||
"gulangxian": "古浪县",
|
||||
"gulinxian": "古蔺县",
|
||||
"gulouqu": "鼓楼区",
|
||||
"guoluozangzu": "果洛藏族",
|
||||
"guoluozangzuzizhizhou": "果洛藏族",
|
||||
"gushixian": "固始县",
|
||||
"gusuqu": "姑苏区",
|
||||
"gutaqu": "古塔区",
|
||||
"gutianxian": "古田县",
|
||||
"guxian": "古县",
|
||||
"guyangxian": "固阳县",
|
||||
"guyequ": "古冶区",
|
||||
"guyuan": "固原",
|
||||
"guyuanshi": "固原",
|
||||
"guyuanxian": "沽源县",
|
||||
"guzhangxian": "古丈县",
|
||||
"guzhenxian": "固镇县",
|
||||
"habahexian": "哈巴河县",
|
||||
"haerbin": "哈尔滨",
|
||||
"haerbinshi": "哈尔滨",
|
||||
"haian": "海安市",
|
||||
"haianshi": "海安市",
|
||||
"haibeizangzu": "海北藏族",
|
||||
"haibeizangzuzizhizhou": "海北藏族",
|
||||
"haibowanqu": "海勃湾区",
|
||||
"haicangqu": "海沧区",
|
||||
"haicheng": "海城市",
|
||||
"haichengqu": "海城区",
|
||||
"haichengshi": "海城市",
|
||||
"haidianqu": "海淀区",
|
||||
"haidong": "海东",
|
||||
"haidongshi": "海东",
|
||||
"haifengxian": "海丰县",
|
||||
"haigangqu": "海港区",
|
||||
"haikou": "海口",
|
||||
"haikoushi": "海口",
|
||||
"hailaerqu": "海拉尔区",
|
||||
"hailin": "海林市",
|
||||
"hailingqu": "海陵区",
|
||||
"hailinshi": "海林市",
|
||||
"hailun": "海伦市",
|
||||
"hailunshi": "海伦市",
|
||||
"haimenqu": "海门区",
|
||||
"hainanqu": "海南区",
|
||||
"hainanshengzizhiquzhixiaxianjixingzhengquhua": "海南省-自治区直辖县级行政区划",
|
||||
"hainanzangzu": "海南藏族",
|
||||
"hainanzangzuzizhizhou": "海南藏族",
|
||||
"haining": "海宁市",
|
||||
"hainingshi": "海宁市",
|
||||
"haishuqu": "海曙区",
|
||||
"haitangqu": "海棠区",
|
||||
"haiximengguzuzangzu": "海西蒙古族藏族",
|
||||
"haiximengguzuzangzuzizhizhou": "海西蒙古族藏族",
|
||||
"haixingxian": "海兴县",
|
||||
"haiyang": "海阳市",
|
||||
"haiyangshi": "海阳市",
|
||||
"haiyuanxian": "海原县",
|
||||
"haizhouqu": "海州区",
|
||||
"haizhuqu": "海珠区",
|
||||
"hami": "哈密",
|
||||
"hamishi": "哈密",
|
||||
"hanbinqu": "汉滨区",
|
||||
"hancheng": "韩城市",
|
||||
"hanchengshi": "韩城市",
|
||||
"hanchuan": "汉川市",
|
||||
"hanchuanshi": "汉川市",
|
||||
"handan": "邯郸",
|
||||
"handanjinanxinqu": "邯郸冀南新区",
|
||||
"handanjingjijishukaifaqu": "邯郸经济技术开发区",
|
||||
"handanshi": "邯郸",
|
||||
"hangjinhouqi": "杭锦后旗",
|
||||
"hangjinqi": "杭锦旗",
|
||||
"hangzhou": "杭州",
|
||||
"hangzhoushi": "杭州",
|
||||
"hannanqu": "汉南区",
|
||||
"hanshanqu": "邯山区",
|
||||
"hanshanxian": "含山县",
|
||||
"hanshouxian": "汉寿县",
|
||||
"hantaiqu": "汉台区",
|
||||
"hantingqu": "寒亭区",
|
||||
"hanyangqu": "汉阳区",
|
||||
"hanyinxian": "汉阴县",
|
||||
"hanyuanxian": "汉源县",
|
||||
"hanzhong": "汉中",
|
||||
"hanzhongshi": "汉中",
|
||||
"haojiangqu": "濠江区",
|
||||
"hebeicangzhoujingjikaifaqu": "河北沧州经济开发区",
|
||||
"hebeihengshuigaoxinjishuchanyekaifaqu": "河北衡水高新技术产业开发区",
|
||||
"hebeiqu": "河北区",
|
||||
"hebeitangshanhaigangjingjikaifaqu": "河北唐山海港经济开发区",
|
||||
"hebeitangshanlutaijingjikaifaqu": "河北唐山芦台经济开发区",
|
||||
"hebeixingtaijingjikaifaqu": "河北邢台经济开发区",
|
||||
"hebi": "鹤壁",
|
||||
"hebijingjijishukaifaqu": "鹤壁经济技术开发区",
|
||||
"hebishi": "鹤壁",
|
||||
"hebukesaiermengguzizhixian": "和布克赛尔蒙古自治县",
|
||||
"hechengqu": "鹤城区",
|
||||
"hechi": "河池",
|
||||
"hechishi": "河池",
|
||||
"hechuanqu": "合川区",
|
||||
"hedongqu": "河东区",
|
||||
"hefei": "合肥",
|
||||
"hefeigaoxinjishuchanyekaifaqu": "合肥高新技术产业开发区",
|
||||
"hefeijingjijishukaifaqu": "合肥经济技术开发区",
|
||||
"hefeishi": "合肥",
|
||||
"hefeixinzhangaoxinjishuchanyekaifaqu": "合肥新站高新技术产业开发区",
|
||||
"hefengxian": "鹤峰县",
|
||||
"hegang": "鹤岗",
|
||||
"hegangshi": "鹤岗",
|
||||
"heihe": "黑河",
|
||||
"heiheshi": "黑河",
|
||||
"heishanxian": "黑山县",
|
||||
"heishuixian": "黑水县",
|
||||
"hejian": "河间市",
|
||||
"hejiangxian": "合江县",
|
||||
"hejianshi": "河间市",
|
||||
"hejin": "河津市",
|
||||
"hejingxian": "和静县",
|
||||
"hejinshi": "河津市",
|
||||
"hekouqu": "河口区",
|
||||
"hekouyaozuzizhixian": "河口瑶族自治县",
|
||||
"helanxian": "贺兰县",
|
||||
"helingeerxian": "和林格尔县",
|
||||
"helong": "和龙市",
|
||||
"helongshi": "和龙市",
|
||||
"henanmengguzuzizhixian": "河南蒙古族自治县",
|
||||
"henanpuyanggongyeyuanqu": "河南濮阳工业园区",
|
||||
"henansanmenxiajingjikaifaqu": "河南三门峡经济开发区",
|
||||
"henanshangqiujingjikaifaqu": "河南商丘经济开发区",
|
||||
"henanshengshengzhixiaxianjixingzhengquhua": "河南省-省直辖县级行政区划",
|
||||
"henanzhoukoujingjikaifaqu": "河南周口经济开发区",
|
||||
"henanzhumadianjingjikaifaqu": "河南驻马店经济开发区",
|
||||
"hengdongxian": "衡东县",
|
||||
"hengfengxian": "横峰县",
|
||||
"hengnanxian": "衡南县",
|
||||
"hengshanxian": "衡山县",
|
||||
"hengshui": "衡水",
|
||||
"hengshuibinhuxinqu": "衡水滨湖新区",
|
||||
"hengshuishi": "衡水",
|
||||
"hengxian": "横县",
|
||||
"hengyang": "衡阳",
|
||||
"hengyangshi": "衡阳",
|
||||
"hengyangxian": "衡阳县",
|
||||
"hengyangzonghebaoshuiqu": "衡阳综合保税区",
|
||||
"hengzhou": "横州市",
|
||||
"hengzhoushi": "横州市",
|
||||
"hepingqu": "和平区",
|
||||
"hepingxian": "和平县",
|
||||
"hepuxian": "合浦县",
|
||||
"heqingxian": "鹤庆县",
|
||||
"hequxian": "河曲县",
|
||||
"heshuixian": "合水县",
|
||||
"heshunxian": "和顺县",
|
||||
"heshuoxian": "和硕县",
|
||||
"hetangqu": "荷塘区",
|
||||
"hetiandiqu": "和田",
|
||||
"hetianshi": "和田市",
|
||||
"hetianxian": "和田县",
|
||||
"hexian": "和县",
|
||||
"hexiqu": "河西区",
|
||||
"heyangxian": "合阳县",
|
||||
"heyuan": "河源",
|
||||
"heyuanshi": "河源",
|
||||
"heze": "菏泽",
|
||||
"hezegaoxinjishukaifaqu": "菏泽高新技术开发区",
|
||||
"hezejingjijishukaifaqu": "菏泽经济技术开发区",
|
||||
"hezeshi": "菏泽",
|
||||
"hezhangxian": "赫章县",
|
||||
"hezhengxian": "和政县",
|
||||
"hezhou": "贺州",
|
||||
"hezhoushi": "贺州",
|
||||
"hezuo": "合作市",
|
||||
"hezuoshi": "合作市",
|
||||
"honganxian": "红安县",
|
||||
"hongdongxian": "洪洞县",
|
||||
"honggangqu": "红岗区",
|
||||
"hongguqu": "红古区",
|
||||
"honggutanqu": "红谷滩区",
|
||||
"honghehanizuyizu": "红河哈尼族彝族",
|
||||
"honghehanizuyizuzizhizhou": "红河哈尼族彝族",
|
||||
"honghexian": "红河县",
|
||||
"honghu": "洪湖市",
|
||||
"honghuagangqu": "红花岗区",
|
||||
"honghushi": "洪湖市",
|
||||
"hongjiang": "洪江市",
|
||||
"hongjiangshi": "洪江市",
|
||||
"hongkouqu": "虹口区",
|
||||
"hongqiaoqu": "红桥区",
|
||||
"hongqiqu": "红旗区",
|
||||
"hongsibaoqu": "红寺堡区",
|
||||
"hongtaqu": "红塔区",
|
||||
"hongweiqu": "宏伟区",
|
||||
"hongyaxian": "洪雅县",
|
||||
"hongyuanxian": "红原县",
|
||||
"hongzequ": "洪泽区",
|
||||
"houma": "侯马市",
|
||||
"houmashi": "侯马市",
|
||||
"huaanxian": "华安县",
|
||||
"huachixian": "华池县",
|
||||
"huachuanxian": "桦川县",
|
||||
"huadexian": "化德县",
|
||||
"huadian": "桦甸市",
|
||||
"huadianshi": "桦甸市",
|
||||
"huadimatangqu": "花地玛堂区",
|
||||
"huadouqu": "花都区",
|
||||
"huaian": "淮安",
|
||||
"huaianjingjijishukaifaqu": "淮安经济技术开发区",
|
||||
"huaianqu": "淮安区",
|
||||
"huaianshi": "淮安",
|
||||
"huaianxian": "怀安县",
|
||||
"huaibei": "淮北",
|
||||
"huaibeishi": "淮北",
|
||||
"huaibinxian": "淮滨县",
|
||||
"huaihua": "怀化",
|
||||
"huaihuashi": "怀化",
|
||||
"huaihuashihongjiangguanliqu": "怀化市洪江管理区",
|
||||
"huaijixian": "怀集县",
|
||||
"huailaixian": "怀来县",
|
||||
"huainan": "淮南",
|
||||
"huainanshi": "淮南",
|
||||
"huainingxian": "怀宁县",
|
||||
"huairen": "怀仁市",
|
||||
"huairenshi": "怀仁市",
|
||||
"huairouqu": "怀柔区",
|
||||
"huaishangqu": "淮上区",
|
||||
"huaiyangqu": "淮阳区",
|
||||
"huaiyuanxian": "怀远县",
|
||||
"hualonghuizuzizhixian": "化隆回族自治县",
|
||||
"hualongqu": "华龙区",
|
||||
"huananxian": "桦南县",
|
||||
"huancuiqu": "环翠区",
|
||||
"huang": "黄石",
|
||||
"huangchuanxian": "潢川县",
|
||||
"huangdaoqu": "黄岛区",
|
||||
"huangdaxianqu": "黄大仙区",
|
||||
"huanggang": "黄冈",
|
||||
"huanggangshi": "黄冈",
|
||||
"huangguqu": "皇姑区",
|
||||
"huanghua": "黄骅市",
|
||||
"huanghuashi": "黄骅市",
|
||||
"huanglingxian": "黄陵县",
|
||||
"huanglongxian": "黄龙县",
|
||||
"huangmeixian": "黄梅县",
|
||||
"huangnanzangzu": "黄南藏族",
|
||||
"huangnanzangzuzizhizhou": "黄南藏族",
|
||||
"huangpingxian": "黄平县",
|
||||
"huangpiqu": "黄陂区",
|
||||
"huangshan": "黄山",
|
||||
"huangshanqu": "黄山区",
|
||||
"huangshanshi": "黄山",
|
||||
"huangshi": "黄石",
|
||||
"huangshigangqu": "黄石港区",
|
||||
"huangshishi": "黄石",
|
||||
"huangyanqu": "黄岩区",
|
||||
"huangyuanxian": "湟源县",
|
||||
"huangzhongqu": "湟中区",
|
||||
"huangzhouqu": "黄州区",
|
||||
"huaningxian": "华宁县",
|
||||
"huanjiangmaonanzuzizhixian": "环江毛南族自治县",
|
||||
"huanrenmanzuzizhixian": "桓仁满族自治县",
|
||||
"huantaixian": "桓台县",
|
||||
"huanxian": "环县",
|
||||
"huapingxian": "华坪县",
|
||||
"huarongqu": "华容区",
|
||||
"huarongxian": "华容县",
|
||||
"huashanqu": "花山区",
|
||||
"huating": "华亭市",
|
||||
"huatingshi": "华亭市",
|
||||
"huawangtangqu": "花王堂区",
|
||||
"huaxian": "滑县",
|
||||
"huaxiqu": "花溪区",
|
||||
"huayin": "华阴市",
|
||||
"huaying": "华蓥市",
|
||||
"huayingshi": "华蓥市",
|
||||
"huayinshi": "华阴市",
|
||||
"huayuanxian": "花垣县",
|
||||
"huazhou": "化州市",
|
||||
"huazhouqu": "华州区",
|
||||
"huazhoushi": "化州市",
|
||||
"hubeishengzizhiquzhixiaxianjixingzhengquhua": "湖北省-自治区直辖县级行政区划",
|
||||
"hubinqu": "湖滨区",
|
||||
"huguanxian": "壶关县",
|
||||
"huhehaote": "呼和浩特",
|
||||
"huhehaotejingjijishukaifaqu": "呼和浩特经济技术开发区",
|
||||
"huhehaoteshi": "呼和浩特",
|
||||
"huianxian": "惠安县",
|
||||
"huichangxian": "会昌县",
|
||||
"huichengqu": "惠城区",
|
||||
"huichuanqu": "汇川区",
|
||||
"huichun": "珲春市",
|
||||
"huichunshi": "珲春市",
|
||||
"huijiqu": "惠济区",
|
||||
"huilaixian": "惠来县",
|
||||
"huili": "会理市",
|
||||
"huilishi": "会理市",
|
||||
"huilixian": "会理县",
|
||||
"huiminqu": "回民区",
|
||||
"huiminxian": "惠民县",
|
||||
"huinanxian": "辉南县",
|
||||
"huiningxian": "会宁县",
|
||||
"huinongqu": "惠农区",
|
||||
"huishanqu": "惠山区",
|
||||
"huishuixian": "惠水县",
|
||||
"huitongxian": "会同县",
|
||||
"huixianshi": "辉县市",
|
||||
"huiyangqu": "惠阳区",
|
||||
"huizexian": "会泽县",
|
||||
"huizhou": "惠州",
|
||||
"huizhouqu": "徽州区",
|
||||
"huizhoushi": "惠州",
|
||||
"hukouxian": "湖口县",
|
||||
"hulanqu": "呼兰区",
|
||||
"hulin": "虎林市",
|
||||
"hulinshi": "虎林市",
|
||||
"huliqu": "湖里区",
|
||||
"huludao": "葫芦岛",
|
||||
"huludaoshi": "葫芦岛",
|
||||
"hulunbeier": "呼伦贝尔",
|
||||
"hulunbeiershi": "呼伦贝尔",
|
||||
"humaxian": "呼玛县",
|
||||
"hunanhengyanggaoxinjishuchanyeyuanqu": "湖南衡阳高新技术产业园区",
|
||||
"hunanhengyangsongmujingjikaifaqu": "湖南衡阳松木经济开发区",
|
||||
"hunanxiangtangaoxinjishuchanyeyuanqu": "湖南湘潭高新技术产业园区",
|
||||
"hunanyiyanggaoxinjishuchanyeyuanqu": "湖南益阳高新技术产业园区",
|
||||
"hunjiangqu": "浑江区",
|
||||
"hunnanqu": "浑南区",
|
||||
"hunyuanxian": "浑源县",
|
||||
"huochengxian": "霍城县",
|
||||
"huoerguosi": "霍尔果斯市",
|
||||
"huoerguosishi": "霍尔果斯市",
|
||||
"huojiaxian": "获嘉县",
|
||||
"huolinguolei": "霍林郭勒市",
|
||||
"huolinguoleishi": "霍林郭勒市",
|
||||
"huoqiuxian": "霍邱县",
|
||||
"huoshanxian": "霍山县",
|
||||
"huozhou": "霍州市",
|
||||
"huozhoushi": "霍州市",
|
||||
"huqiuqu": "虎丘区",
|
||||
"hutubixian": "呼图壁县",
|
||||
"huyanghe": "胡杨河市",
|
||||
"huyangheshi": "胡杨河市",
|
||||
"huyiqu": "鄠邑区",
|
||||
"huzhongqu": "呼中区",
|
||||
"huzhou": "湖州",
|
||||
"huzhoushi": "湖州",
|
||||
"huzhutuzuzizhixian": "互助土族自治县",
|
||||
"jiachaxian": "加查县",
|
||||
"jiadingqu": "嘉定区",
|
||||
"jiagedaqiqu": "加格达奇区",
|
||||
"jiahexian": "嘉禾县",
|
||||
"jiajiangxian": "夹江县",
|
||||
"jialingqu": "嘉陵区",
|
||||
"jialixian": "嘉黎县",
|
||||
"jiamotangqu": "嘉模堂区",
|
||||
"jiamusi": "佳木斯",
|
||||
"jiamusishi": "佳木斯",
|
||||
"jiananqu": "建安区",
|
||||
"jiancaopingqu": "尖草坪区",
|
||||
"jianchangxian": "建昌县",
|
||||
"jianchuanxian": "剑川县",
|
||||
"jiande": "建德市",
|
||||
"jiandeshi": "建德市",
|
||||
"jianganqu": "江岸区",
|
||||
"jianganxian": "江安县",
|
||||
"jiangbeiqu": "江北区",
|
||||
"jiangchenghanizuyizuzizhixian": "江城哈尼族彝族自治县",
|
||||
"jiangchengqu": "江城区",
|
||||
"jiangchuanqu": "江川区",
|
||||
"jiangdaxian": "江达县",
|
||||
"jiangduqu": "江都区",
|
||||
"jiangexian": "剑阁县",
|
||||
"jiangganqu": "江干区",
|
||||
"jianghaiqu": "江海区",
|
||||
"jianghanqu": "江汉区",
|
||||
"jianghuayaozuzizhixian": "江华瑶族自治县",
|
||||
"jiangjinqu": "江津区",
|
||||
"jiangkouxian": "江口县",
|
||||
"jianglexian": "将乐县",
|
||||
"jianglingxian": "江陵县",
|
||||
"jiangmen": "江门",
|
||||
"jiangmenshi": "江门",
|
||||
"jiangnanqu": "江南区",
|
||||
"jiangningqu": "江宁区",
|
||||
"jiangshan": "江山市",
|
||||
"jiangshanshi": "江山市",
|
||||
"jiangxian": "绛县",
|
||||
"jiangxiaqu": "江夏区",
|
||||
"jiangyangqu": "江阳区",
|
||||
"jiangyanqu": "姜堰区",
|
||||
"jiangyin": "江阴市",
|
||||
"jiangyinshi": "江阴市",
|
||||
"jiangyongxian": "江永县",
|
||||
"jiangyou": "江油市",
|
||||
"jiangyoushi": "江油市",
|
||||
"jiangyuanqu": "江源区",
|
||||
"jiangzhouqu": "江州区",
|
||||
"jiangzixian": "江孜县",
|
||||
"jianhexian": "剑河县",
|
||||
"jianhuaqu": "建华区",
|
||||
"jianhuxian": "建湖县",
|
||||
"jianli": "监利市",
|
||||
"jianlishi": "监利市",
|
||||
"jianningxian": "建宁县",
|
||||
"jianou": "建瓯市",
|
||||
"jianoushi": "建瓯市",
|
||||
"jianpingxian": "建平县",
|
||||
"jianshanqu": "尖山区",
|
||||
"jianshixian": "建始县",
|
||||
"jianshuixian": "建水县",
|
||||
"jianxian": "吉安县",
|
||||
"jianxiqu": "涧西区",
|
||||
"jianyang": "简阳市",
|
||||
"jianyangqu": "建阳区",
|
||||
"jianyangshi": "简阳市",
|
||||
"jianyequ": "建邺区",
|
||||
"jianzhaxian": "尖扎县",
|
||||
"jiaochengqu": "蕉城区",
|
||||
"jiaochengxian": "交城县",
|
||||
"jiaohe": "蛟河市",
|
||||
"jiaoheshi": "蛟河市",
|
||||
"jiaojiangqu": "椒江区",
|
||||
"jiaokouxian": "交口县",
|
||||
"jiaolingxian": "蕉岭县",
|
||||
"jiaoqu": "郊区",
|
||||
"jiaozhou": "胶州市",
|
||||
"jiaozhoushi": "胶州市",
|
||||
"jiaozuo": "焦作",
|
||||
"jiaozuochengxiangyitihuashifanqu": "焦作城乡一体化示范区",
|
||||
"jiaozuoshi": "焦作",
|
||||
"jiashanxian": "嘉善县",
|
||||
"jiawangqu": "贾汪区",
|
||||
"jiaxiangxian": "嘉祥县",
|
||||
"jiaxing": "嘉兴",
|
||||
"jiaxingshi": "嘉兴",
|
||||
"jiayinxian": "嘉荫县",
|
||||
"jiayuguan": "嘉峪关",
|
||||
"jiayuguanshi": "嘉峪关",
|
||||
"jiayuxian": "嘉鱼县",
|
||||
"jidongxian": "鸡东县",
|
||||
"jiedongqu": "揭东区",
|
||||
"jiefangqu": "解放区",
|
||||
"jieshou": "界首市",
|
||||
"jieshoushi": "界首市",
|
||||
"jiexiu": "介休市",
|
||||
"jiexiushi": "介休市",
|
||||
"jiexixian": "揭西县",
|
||||
"jieyang": "揭阳",
|
||||
"jieyangshi": "揭阳",
|
||||
"jiguanqu": "鸡冠区",
|
||||
"jilin": "吉林",
|
||||
"jilinbaichengjingjikaifaqu": "吉林白城经济开发区",
|
||||
"jilingaoxinjishuchanyekaifaqu": "吉林高新技术产业开发区",
|
||||
"jilinjingjikaifaqu": "吉林经济开发区",
|
||||
"jilinshi": "吉林",
|
||||
"jilinsongyuanjingjikaifaqu": "吉林松原经济开发区",
|
||||
"jilinzhongguoxinjiaposhipinqu": "吉林中国新加坡食品区",
|
||||
"jiliqu": "吉利区",
|
||||
"jilongxian": "吉隆县",
|
||||
"jimeiqu": "集美区",
|
||||
"jimoqu": "即墨区",
|
||||
"jimunaixian": "吉木乃县",
|
||||
"jimusaerxian": "吉木萨尔县",
|
||||
"jin": "金林区",
|
||||
"jinan": "济南",
|
||||
"jinangaoxinjishuchanyekaifaqu": "济南高新技术产业开发区",
|
||||
"jinanshi": "济南",
|
||||
"jinchang": "金昌",
|
||||
"jinchangshi": "金昌",
|
||||
"jincheng": "晋城",
|
||||
"jinchengjiangqu": "金城江区",
|
||||
"jinchengshi": "晋城",
|
||||
"jinchuanqu": "金川区",
|
||||
"jinchuanxian": "金川县",
|
||||
"jindongqu": "金东区",
|
||||
"jinfengqu": "金凤区",
|
||||
"jinganqu": "静安区",
|
||||
"jinganxian": "靖安县",
|
||||
"jingbianxian": "靖边县",
|
||||
"jingchuanxian": "泾川县",
|
||||
"jingdexian": "旌德县",
|
||||
"jingdezhen": "景德镇",
|
||||
"jingdezhenshi": "景德镇",
|
||||
"jingdongyizuzizhixian": "景东彝族自治县",
|
||||
"jinggangshan": "井冈山市",
|
||||
"jinggangshanshi": "井冈山市",
|
||||
"jinggudaizuyizuzizhixian": "景谷傣族彝族自治县",
|
||||
"jinghaiqu": "静海区",
|
||||
"jinghexian": "精河县",
|
||||
"jinghong": "景洪市",
|
||||
"jinghongshi": "景洪市",
|
||||
"jinghuqu": "镜湖区",
|
||||
"jingjiang": "靖江市",
|
||||
"jingjiangshi": "靖江市",
|
||||
"jingkouqu": "京口区",
|
||||
"jinglexian": "静乐县",
|
||||
"jingmen": "荆门",
|
||||
"jingmenshi": "荆门",
|
||||
"jingningshezuzizhixian": "景宁畲族自治县",
|
||||
"jingningxian": "静宁县",
|
||||
"jingshan": "京山市",
|
||||
"jingshanshi": "京山市",
|
||||
"jingtaixian": "景泰县",
|
||||
"jingxi": "靖西市",
|
||||
"jingxingkuangqu": "井陉矿区",
|
||||
"jingxingxian": "井陉县",
|
||||
"jingxishi": "靖西市",
|
||||
"jingxiuqu": "竞秀区",
|
||||
"jingyangqu": "旌阳区",
|
||||
"jingyangxian": "泾阳县",
|
||||
"jingyanxian": "井研县",
|
||||
"jingyuxian": "靖宇县",
|
||||
"jingzhou": "荆州",
|
||||
"jingzhoujingjijishukaifaqu": "荆州经济技术开发区",
|
||||
"jingzhoumiaozudongzuzizhixian": "靖州苗族侗族自治县",
|
||||
"jingzhouqu": "荆州区",
|
||||
"jingzhoushi": "荆州",
|
||||
"jinhua": "金华",
|
||||
"jinhuashi": "金华",
|
||||
"jinhuxian": "金湖县",
|
||||
"jining": "济宁",
|
||||
"jininggaoxinjishuchanyekaifaqu": "济宁高新技术产业开发区",
|
||||
"jiningqu": "集宁区",
|
||||
"jiningshi": "济宁",
|
||||
"jinjiang": "晋江市",
|
||||
"jinjiangqu": "锦江区",
|
||||
"jinjiangshi": "晋江市",
|
||||
"jinkouhequ": "金口河区",
|
||||
"jinlinqu": "金林区",
|
||||
"jinmenxian": "金门县",
|
||||
"jinnanqu": "津南区",
|
||||
"jinningqu": "晋宁区",
|
||||
"jinniuqu": "金牛区",
|
||||
"jinpingmiaozuyaozudaizuzizhixian": "金平苗族瑶族傣族自治县",
|
||||
"jinpingqu": "金平区",
|
||||
"jinpingxian": "锦屏县",
|
||||
"jinshanqu": "金山区",
|
||||
"jinshaxian": "金沙县",
|
||||
"jinshi": "津市市",
|
||||
"jinshishi": "津市市",
|
||||
"jinshuiqu": "金水区",
|
||||
"jintaiqu": "金台区",
|
||||
"jintangxian": "金堂县",
|
||||
"jintanqu": "金坛区",
|
||||
"jintaxian": "金塔县",
|
||||
"jinwanqu": "金湾区",
|
||||
"jinxiangxian": "金乡县",
|
||||
"jinxianxian": "进贤县",
|
||||
"jinxiuyaozuzizhixian": "金秀瑶族自治县",
|
||||
"jinxixian": "金溪县",
|
||||
"jinyangxian": "金阳县",
|
||||
"jinyuanqu": "晋源区",
|
||||
"jinyunxian": "缙云县",
|
||||
"jinzhaixian": "金寨县",
|
||||
"jinzhong": "晋中",
|
||||
"jinzhongshi": "晋中",
|
||||
"jinzhouqu": "金州区",
|
||||
"jishanxian": "稷山县",
|
||||
"jishishanbaoanzudongxiangzusalazuzizhixian": "积石山保安族东乡族撒拉族自治县",
|
||||
"jishou": "吉首市",
|
||||
"jishoushi": "吉首市",
|
||||
"jishuixian": "吉水县",
|
||||
"jiujiang": "九江",
|
||||
"jiujiangqu": "鸠江区",
|
||||
"jiujiangshi": "九江",
|
||||
"jiulongchengqu": "九龙城区",
|
||||
"jiulongpoqu": "九龙坡区",
|
||||
"jiulongxian": "九龙县",
|
||||
"jiuquan": "酒泉",
|
||||
"jiuquanshi": "酒泉",
|
||||
"jiutaiqu": "九台区",
|
||||
"jiuyuanqu": "九原区",
|
||||
"jiuzhaigouxian": "九寨沟县",
|
||||
"jiuzhixian": "久治县",
|
||||
"jixi": "鸡西",
|
||||
"jixian": "吉县",
|
||||
"jixianxian": "集贤县",
|
||||
"jixishi": "鸡西",
|
||||
"jixixian": "绩溪县",
|
||||
"jiyuan": "济源市",
|
||||
"jiyuanshi": "济源市",
|
||||
"jizexian": "鸡泽县",
|
||||
"juanchengxian": "鄄城县",
|
||||
"juluxian": "巨鹿县",
|
||||
"junanxian": "莒南县",
|
||||
"junshanqu": "君山区",
|
||||
"junxian": "浚县",
|
||||
"jurong": "句容市",
|
||||
"jurongshi": "句容市",
|
||||
"juxian": "莒县",
|
||||
"juyexian": "巨野县",
|
||||
"ka": "喀什",
|
||||
"kaifeng": "开封",
|
||||
"kaifengshi": "开封",
|
||||
"kaifuqu": "开福区",
|
||||
"kaihuaxian": "开化县",
|
||||
"kaijiangxian": "开江县",
|
||||
"kaili": "凯里市",
|
||||
"kailishi": "凯里市",
|
||||
"kailuxian": "开鲁县",
|
||||
"kaiping": "开平市",
|
||||
"kaipingqu": "开平区",
|
||||
"kaipingshi": "开平市",
|
||||
"kaiyangxian": "开阳县",
|
||||
"kaizhouqu": "开州区",
|
||||
"kalaqinqi": "喀喇沁旗",
|
||||
"kalaqinzuoyimengguzuzizhixian": "喀喇沁左翼蒙古族自治县",
|
||||
"kangbaoxian": "康保县",
|
||||
"kangbashenqu": "康巴什区",
|
||||
"kangding": "康定市",
|
||||
"kangdingshi": "康定市",
|
||||
"kanglexian": "康乐县",
|
||||
"kangmaxian": "康马县",
|
||||
"kangpingxian": "康平县",
|
||||
"kangxian": "康县",
|
||||
"karuoqu": "卡若区",
|
||||
"kashidiqu": "喀什",
|
||||
"kashishi": "喀什市",
|
||||
"kechengqu": "柯城区",
|
||||
"kedongxian": "克东县",
|
||||
"keerqinqu": "科尔沁区",
|
||||
"keerqinyouyiqianqi": "科尔沁右翼前旗",
|
||||
"keerqinyouyizhongqi": "科尔沁右翼中旗",
|
||||
"keerqinzuoyihouqi": "科尔沁左翼后旗",
|
||||
"keerqinzuoyizhongqi": "科尔沁左翼中旗",
|
||||
"kekedala": "可克达拉市",
|
||||
"kekedalashi": "可克达拉市",
|
||||
"kelamayi": "克拉玛依",
|
||||
"kelamayiqu": "克拉玛依区",
|
||||
"kelamayishi": "克拉玛依",
|
||||
"kelanxian": "岢岚县",
|
||||
"kenliqu": "垦利区",
|
||||
"kepingxian": "柯坪县",
|
||||
"keqiaoqu": "柯桥区",
|
||||
"keshanxian": "克山县",
|
||||
"keshenketengqi": "克什克腾旗",
|
||||
"kezileisukeerkezi": "克孜勒苏柯尔克孜",
|
||||
"kezileisukeerkezizizhizhou": "克孜勒苏柯尔克孜",
|
||||
"kongdongqu": "崆峒区",
|
||||
"kuanchengmanzuzizhixian": "宽城满族自治县",
|
||||
"kuanchengqu": "宽城区",
|
||||
"kuandianmanzuzizhixian": "宽甸满族自治县",
|
||||
"kuangqu": "矿区",
|
||||
"kuche": "库车市",
|
||||
"kucheshi": "库车市",
|
||||
"kuerlei": "库尔勒市",
|
||||
"kuerleijingjijishukaifaqu": "库尔勒经济技术开发区",
|
||||
"kuerleishi": "库尔勒市",
|
||||
"kuiqingqu": "葵青区",
|
||||
"kuitun": "奎屯市",
|
||||
"kuitunshi": "奎屯市",
|
||||
"kuiwenqu": "奎文区",
|
||||
"kulunqi": "库伦旗",
|
||||
"kundoulunqu": "昆都仑区",
|
||||
"kunming": "昆明",
|
||||
"kunmingshi": "昆明",
|
||||
"kunshan": "昆山市",
|
||||
"kunshanshi": "昆山市",
|
||||
"kunyu": "昆玉市",
|
||||
"kunyushi": "昆玉市",
|
||||
"laianxian": "来安县",
|
||||
"laibin": "来宾",
|
||||
"laibinshi": "来宾",
|
||||
"laifengxian": "来凤县",
|
||||
"laishanqu": "莱山区",
|
||||
"laishuixian": "涞水县",
|
||||
"laiwuqu": "莱芜区",
|
||||
"laixi": "莱西市",
|
||||
"laixishi": "莱西市",
|
||||
"laiyang": "莱阳市",
|
||||
"laiyangshi": "莱阳市",
|
||||
"laiyuanxian": "涞源县",
|
||||
"laizhou": "莱州市",
|
||||
"laizhoushi": "莱州市",
|
||||
"lancanglahuzuzizhixian": "澜沧拉祜族自治县",
|
||||
"langaoxian": "岚皋县",
|
||||
"langfang": "廊坊",
|
||||
"langfangjingjijishukaifaqu": "廊坊经济技术开发区",
|
||||
"langfangshi": "廊坊",
|
||||
"langqiazixian": "浪卡子县",
|
||||
"langxian": "朗县",
|
||||
"langxixian": "郎溪县",
|
||||
"langyaqu": "琅琊区",
|
||||
"langzhong": "阆中市",
|
||||
"langzhongshi": "阆中市",
|
||||
"lankaoxian": "兰考县",
|
||||
"lanlingxian": "兰陵县",
|
||||
"lanpingbaizupumizuzizhixian": "兰坪白族普米族自治县",
|
||||
"lanshanxian": "蓝山县",
|
||||
"lantianxian": "蓝田县",
|
||||
"lanxi": "兰溪市",
|
||||
"lanxian": "岚县",
|
||||
"lanxishi": "兰溪市",
|
||||
"lanxixian": "兰西县",
|
||||
"lanzhou": "兰州",
|
||||
"lanzhoushi": "兰州",
|
||||
"lanzhouxinqu": "兰州新区",
|
||||
"laobianqu": "老边区",
|
||||
"laochengqu": "老城区",
|
||||
"laohekou": "老河口市",
|
||||
"laohekoushi": "老河口市",
|
||||
"laoshanqu": "崂山区",
|
||||
"laotingxian": "乐亭县",
|
||||
"lasa": "拉萨",
|
||||
"lasajingjijishukaifaqu": "拉萨经济技术开发区",
|
||||
"lasashi": "拉萨",
|
||||
"lazixian": "拉孜县",
|
||||
"leanxian": "乐安县",
|
||||
"lechang": "乐昌市",
|
||||
"lechangshi": "乐昌市",
|
||||
"ledonglizuzizhixian": "乐东黎族自治县",
|
||||
"leduqu": "乐都区",
|
||||
"leiboxian": "雷波县",
|
||||
"leishanxian": "雷山县",
|
||||
"leiwuqixian": "类乌齐县",
|
||||
"leiyang": "耒阳市",
|
||||
"leiyangshi": "耒阳市",
|
||||
"leizhou": "雷州市",
|
||||
"leizhoushi": "雷州市",
|
||||
"leling": "乐陵市",
|
||||
"lelingshi": "乐陵市",
|
||||
"lengshuijiang": "冷水江市",
|
||||
"lengshuijiangshi": "冷水江市",
|
||||
"lengshuitanqu": "冷水滩区",
|
||||
"leping": "乐平市",
|
||||
"lepingshi": "乐平市",
|
||||
"leshan": "乐山",
|
||||
"leshanshi": "乐山",
|
||||
"leyexian": "乐业县",
|
||||
"lezhixian": "乐至县",
|
||||
"lianchengxian": "连城县",
|
||||
"lianchiqu": "莲池区",
|
||||
"liandouqu": "莲都区",
|
||||
"liangchengxian": "凉城县",
|
||||
"liangdangxian": "两当县",
|
||||
"lianghexian": "梁河县",
|
||||
"liangpingqu": "梁平区",
|
||||
"liangqingqu": "良庆区",
|
||||
"liangshanxian": "梁山县",
|
||||
"liangshanyizu": "凉山彝族",
|
||||
"liangshanyizuzizhizhou": "凉山彝族",
|
||||
"liangxiqu": "梁溪区",
|
||||
"liangyuanqu": "梁园区",
|
||||
"liangzhouqu": "凉州区",
|
||||
"liangzihuqu": "梁子湖区",
|
||||
"lianhuaxian": "莲花县",
|
||||
"lianhuqu": "莲湖区",
|
||||
"lianjiang": "廉江市",
|
||||
"lianjiangshi": "廉江市",
|
||||
"lianjiangxian": "连江县",
|
||||
"liannanyaozuzizhixian": "连南瑶族自治县",
|
||||
"lianpingxian": "连平县",
|
||||
"lianshanqu": "连山区",
|
||||
"lianshanzhuangzuyaozuzizhixian": "连山壮族瑶族自治县",
|
||||
"lianshuixian": "涟水县",
|
||||
"lianxiqu": "濂溪区",
|
||||
"lianyuan": "涟源市",
|
||||
"lianyuanshi": "涟源市",
|
||||
"lianyungang": "连云港",
|
||||
"lianyunganggaoxinjishuchanyekaifaqu": "连云港高新技术产业开发区",
|
||||
"lianyungangjingjijishukaifaqu": "连云港经济技术开发区",
|
||||
"lianyungangshi": "连云港",
|
||||
"lianyunqu": "连云区",
|
||||
"lianzhou": "连州市",
|
||||
"lianzhoushi": "连州市",
|
||||
"liaocheng": "聊城",
|
||||
"liaochengshi": "聊城",
|
||||
"liaoyang": "辽阳",
|
||||
"liaoyangshi": "辽阳",
|
||||
"liaoyangxian": "辽阳县",
|
||||
"liaoyuan": "辽源",
|
||||
"liaoyuanshi": "辽源",
|
||||
"liaozhongqu": "辽中区",
|
||||
"liboxian": "荔波县",
|
||||
"licangqu": "李沧区",
|
||||
"lichengxian": "黎城县",
|
||||
"lichuan": "利川市",
|
||||
"lichuanshi": "利川市",
|
||||
"lichuanxian": "黎川县",
|
||||
"lidaoqu": "离岛区",
|
||||
"lieshanqu": "烈山区",
|
||||
"lijiang": "丽江",
|
||||
"lijiangshi": "丽江",
|
||||
"lijinxian": "利津县",
|
||||
"liling": "醴陵市",
|
||||
"lilingshi": "醴陵市",
|
||||
"linanqu": "临安区",
|
||||
"lincang": "临沧",
|
||||
"lincangshi": "临沧",
|
||||
"linchengxian": "临城县",
|
||||
"linchuanqu": "临川区",
|
||||
"lindianxian": "林甸县",
|
||||
"linfen": "临汾",
|
||||
"linfenshi": "临汾",
|
||||
"lingaoxian": "临高县",
|
||||
"lingbao": "灵宝市",
|
||||
"lingbaoshi": "灵宝市",
|
||||
"lingbixian": "灵璧县",
|
||||
"lingchengqu": "陵城区",
|
||||
"lingdongqu": "岭东区",
|
||||
"linghai": "凌海市",
|
||||
"linghaishi": "凌海市",
|
||||
"linghequ": "凌河区",
|
||||
"linglingqu": "零陵区",
|
||||
"lingqiuxian": "灵丘县",
|
||||
"lingshanxian": "灵山县",
|
||||
"lingshixian": "灵石县",
|
||||
"lingshouxian": "灵寿县",
|
||||
"lingshuilizuzizhixian": "陵水黎族自治县",
|
||||
"lingtaixian": "灵台县",
|
||||
"linguiqu": "临桂区",
|
||||
"lingwu": "灵武市",
|
||||
"lingwushi": "灵武市",
|
||||
"lingyuan": "凌源市",
|
||||
"lingyuanshi": "凌源市",
|
||||
"lingyunxian": "凌云县",
|
||||
"linhai": "临海市",
|
||||
"linhaishi": "临海市",
|
||||
"linhequ": "临河区",
|
||||
"linjiang": "临江市",
|
||||
"linjiangshi": "临江市",
|
||||
"linkouxian": "林口县",
|
||||
"linlixian": "临澧县",
|
||||
"linpingqu": "临平区",
|
||||
"linqing": "临清市",
|
||||
"linqingshi": "临清市",
|
||||
"linquanxian": "临泉县",
|
||||
"linquxian": "临朐县",
|
||||
"linshuixian": "邻水县",
|
||||
"linshuxian": "临沭县",
|
||||
"lintanxian": "临潭县",
|
||||
"lintaoxian": "临洮县",
|
||||
"lintongqu": "临潼区",
|
||||
"linweiqu": "临渭区",
|
||||
"linwuxian": "临武县",
|
||||
"linxia": "临夏市",
|
||||
"linxiahuizu": "临夏回族",
|
||||
"linxiahuizuzizhizhou": "临夏回族",
|
||||
"linxian": "临县",
|
||||
"linxiang": "临湘市",
|
||||
"linxiangqu": "临翔区",
|
||||
"linxiangshi": "临湘市",
|
||||
"linxiashi": "临夏市",
|
||||
"linxiaxian": "临夏县",
|
||||
"linyi": "临沂",
|
||||
"linyigaoxinjishuchanyekaifaqu": "临沂高新技术产业开发区",
|
||||
"linyingxian": "临颍县",
|
||||
"linyishi": "临沂",
|
||||
"linyouxian": "麟游县",
|
||||
"linzexian": "临泽县",
|
||||
"linzhangxian": "临漳县",
|
||||
"linzhi": "林芝",
|
||||
"linzhishi": "林芝",
|
||||
"linzhou": "林州市",
|
||||
"linzhoushi": "林州市",
|
||||
"linzhouxian": "林周县",
|
||||
"linziqu": "临淄区",
|
||||
"lipingxian": "黎平县",
|
||||
"lipu": "荔浦市",
|
||||
"lipushi": "荔浦市",
|
||||
"liquanxian": "礼泉县",
|
||||
"lishanqu": "立山区",
|
||||
"lishiqu": "离石区",
|
||||
"lishui": "丽水",
|
||||
"lishuiqu": "溧水区",
|
||||
"lishuishi": "丽水",
|
||||
"lishuqu": "梨树区",
|
||||
"lishuxian": "梨树县",
|
||||
"litangxian": "理塘县",
|
||||
"litongqu": "利通区",
|
||||
"liubaxian": "留坝县",
|
||||
"liubeiqu": "柳北区",
|
||||
"liuchengxian": "柳城县",
|
||||
"liuhequ": "六合区",
|
||||
"liuhexian": "柳河县",
|
||||
"liujiangqu": "柳江区",
|
||||
"liulinxian": "柳林县",
|
||||
"liunanqu": "柳南区",
|
||||
"liupanshui": "六盘水",
|
||||
"liupanshuishi": "六盘水",
|
||||
"liuyang": "浏阳市",
|
||||
"liuyangshi": "浏阳市",
|
||||
"liuzhitequ": "六枝特区",
|
||||
"liuzhou": "柳州",
|
||||
"liuzhoushi": "柳州",
|
||||
"liwanqu": "荔湾区",
|
||||
"lixiaqu": "历下区",
|
||||
"lixinxian": "利辛县",
|
||||
"liyang": "溧阳市",
|
||||
"liyangshi": "溧阳市",
|
||||
"lizhouqu": "利州区",
|
||||
"longanqu": "龙安区",
|
||||
"longanxian": "隆安县",
|
||||
"longchang": "隆昌市",
|
||||
"longchangshi": "隆昌市",
|
||||
"longchengqu": "龙城区",
|
||||
"longdexian": "隆德县",
|
||||
"longfengqu": "龙凤区",
|
||||
"longgang": "龙港市",
|
||||
"longgangshi": "龙港市",
|
||||
"longganhuguanliqu": "龙感湖管理区",
|
||||
"longhai": "龙海市",
|
||||
"longhaiqu": "龙海区",
|
||||
"longhaishi": "龙海市",
|
||||
"longhuaqu": "龙华区",
|
||||
"longhuaxian": "隆化县",
|
||||
"longhuixian": "隆回县",
|
||||
"longhuqu": "龙湖区",
|
||||
"longjiangxian": "龙江县",
|
||||
"longjing": "龙井市",
|
||||
"longjingshi": "龙井市",
|
||||
"longkou": "龙口市",
|
||||
"longkoushi": "龙口市",
|
||||
"longlingezuzizhixian": "隆林各族自治县",
|
||||
"longlingxian": "龙陵县",
|
||||
"longlixian": "龙里县",
|
||||
"longmatanqu": "龙马潭区",
|
||||
"longmenxian": "龙门县",
|
||||
"longquan": "龙泉市",
|
||||
"longquanshi": "龙泉市",
|
||||
"longquanyiqu": "龙泉驿区",
|
||||
"longshanqu": "龙山区",
|
||||
"longshanxian": "龙山县",
|
||||
"longshaqu": "龙沙区",
|
||||
"longshenggezuzizhixian": "龙胜各族自治县",
|
||||
"longtanqu": "龙潭区",
|
||||
"longtingqu": "龙亭区",
|
||||
"longwanqu": "龙湾区",
|
||||
"longweiqu": "龙圩区",
|
||||
"longwenqu": "龙文区",
|
||||
"longxian": "陇县",
|
||||
"longxixian": "陇西县",
|
||||
"longyan": "龙岩",
|
||||
"longyangqu": "隆阳区",
|
||||
"longyanshi": "龙岩",
|
||||
"longyaoxian": "隆尧县",
|
||||
"longyouxian": "龙游县",
|
||||
"longzhouxian": "龙州县",
|
||||
"longzihuqu": "龙子湖区",
|
||||
"longzixian": "隆子县",
|
||||
"loudi": "娄底",
|
||||
"loudishi": "娄底",
|
||||
"loufanxian": "娄烦县",
|
||||
"louxingqu": "娄星区",
|
||||
"luan": "六安",
|
||||
"luanchengqu": "栾城区",
|
||||
"luanchuanxian": "栾川县",
|
||||
"luannanxian": "滦南县",
|
||||
"luanpingxian": "滦平县",
|
||||
"luanshi": "六安",
|
||||
"luanzhou": "滦州市",
|
||||
"luanzhoushi": "滦州市",
|
||||
"lubeiqu": "路北区",
|
||||
"luchuanxian": "陆川县",
|
||||
"ludangtianhaiqu": "路凼填海区",
|
||||
"ludianxian": "鲁甸县",
|
||||
"ludingxian": "泸定县",
|
||||
"lufengxian": "禄丰县",
|
||||
"luhexian": "陆河县",
|
||||
"luhuoxian": "炉霍县",
|
||||
"lujiangxian": "庐江县",
|
||||
"lukouqu": "渌口区",
|
||||
"luliangxian": "陆良县",
|
||||
"lulongxian": "卢龙县",
|
||||
"lunanqu": "路南区",
|
||||
"luntaixian": "轮台县",
|
||||
"luobeixian": "萝北县",
|
||||
"luochengmulaozuzizhixian": "罗城仫佬族自治县",
|
||||
"luochuanxian": "洛川县",
|
||||
"luodianxian": "罗甸县",
|
||||
"luoding": "罗定市",
|
||||
"luodingshi": "罗定市",
|
||||
"luohuqu": "罗湖区",
|
||||
"luolongqu": "洛龙区",
|
||||
"luolongxian": "洛隆县",
|
||||
"luonanxian": "洛南县",
|
||||
"luoningxian": "洛宁县",
|
||||
"luopingxian": "罗平县",
|
||||
"luopuxian": "洛浦县",
|
||||
"luoshanxian": "罗山县",
|
||||
"luotianxian": "罗田县",
|
||||
"luoyang": "洛阳",
|
||||
"luoyanggaoxinjishuchanyekaifaqu": "洛阳高新技术产业开发区",
|
||||
"luoyangshi": "洛阳",
|
||||
"luoyuanxian": "罗源县",
|
||||
"luozhaxian": "洛扎县",
|
||||
"luozhuangqu": "罗庄区",
|
||||
"luqiaoqu": "路桥区",
|
||||
"luquanqu": "鹿泉区",
|
||||
"luquanyizumiaozuzizhixian": "禄劝彝族苗族自治县",
|
||||
"luquxian": "碌曲县",
|
||||
"lushan": "庐山市",
|
||||
"lushanshi": "庐山市",
|
||||
"lushixian": "卢氏县",
|
||||
"lushui": "泸水市",
|
||||
"lushuishi": "泸水市",
|
||||
"lusongqu": "芦淞区",
|
||||
"luxian": "泸县",
|
||||
"luyangqu": "庐阳区",
|
||||
"luyixian": "鹿邑县",
|
||||
"luzhaixian": "鹿寨县",
|
||||
"luzhou": "泸州",
|
||||
"luzhouqu": "潞州区",
|
||||
"luzhoushi": "泸州",
|
||||
"lvchunxian": "绿春县",
|
||||
"lveyangxian": "略阳县",
|
||||
"lvliang": "吕梁",
|
||||
"lvliangshi": "吕梁",
|
||||
"lvshunkouqu": "旅顺口区",
|
||||
"lvyuanqu": "绿园区",
|
||||
"maanshan": "马鞍山",
|
||||
"maanshanshi": "马鞍山",
|
||||
"mabianyizuzizhixian": "马边彝族自治县",
|
||||
"macheng": "麻城市",
|
||||
"machengshi": "麻城市",
|
||||
"macunqu": "马村区",
|
||||
"maduoxian": "玛多县",
|
||||
"maerkang": "马尔康市",
|
||||
"maerkangshi": "马尔康市",
|
||||
"maguanxian": "马关县",
|
||||
"maigaitixian": "麦盖提县",
|
||||
"maijiqu": "麦积区",
|
||||
"majiangxian": "麻江县",
|
||||
"malipoxian": "麻栗坡县",
|
||||
"malongqu": "马龙区",
|
||||
"manasixian": "玛纳斯县",
|
||||
"manchengqu": "满城区",
|
||||
"mang": "芒市",
|
||||
"mangkangxian": "芒康县",
|
||||
"mangshi": "芒市",
|
||||
"mangya": "茫崖市",
|
||||
"mangyashi": "茫崖市",
|
||||
"manzhouli": "满洲里市",
|
||||
"manzhoulishi": "满洲里市",
|
||||
"maojianqu": "茅箭区",
|
||||
"maoming": "茂名",
|
||||
"maomingshi": "茂名",
|
||||
"maonanqu": "茂南区",
|
||||
"maoxian": "茂县",
|
||||
"maqinxian": "玛沁县",
|
||||
"maquxian": "玛曲县",
|
||||
"mashanqu": "麻山区",
|
||||
"mashanxian": "马山县",
|
||||
"mayangmiaozuzizhixian": "麻阳苗族自治县",
|
||||
"mayiqu": "马尾区",
|
||||
"mazhangqu": "麻章区",
|
||||
"meiguxian": "美姑县",
|
||||
"meihekou": "梅河口市",
|
||||
"meihekoushi": "梅河口市",
|
||||
"meijiangqu": "梅江区",
|
||||
"meilanqu": "美兰区",
|
||||
"meiliequ": "梅列区",
|
||||
"meilisidawoerzuqu": "梅里斯达斡尔族区",
|
||||
"meishan": "眉山",
|
||||
"meishanshi": "眉山",
|
||||
"meitanxian": "湄潭县",
|
||||
"meixian": "眉县",
|
||||
"meixianqu": "梅县区",
|
||||
"meizhou": "梅州",
|
||||
"meizhoushi": "梅州",
|
||||
"mengchengxian": "蒙城县",
|
||||
"mengcunhuizuzizhixian": "孟村回族自治县",
|
||||
"menghaixian": "勐海县",
|
||||
"mengjinqu": "孟津区",
|
||||
"mengjinxian": "孟津县",
|
||||
"menglaxian": "勐腊县",
|
||||
"mengliandaizulahuzuwazuzizhixian": "孟连傣族拉祜族佤族自治县",
|
||||
"mengshanxian": "蒙山县",
|
||||
"mengyinxian": "蒙阴县",
|
||||
"mengzhou": "孟州市",
|
||||
"mengzhoushi": "孟州市",
|
||||
"mengzi": "蒙自市",
|
||||
"mengzishi": "蒙自市",
|
||||
"mentougouqu": "门头沟区",
|
||||
"menyuanhuizuzizhixian": "门源回族自治县",
|
||||
"mianchixian": "渑池县",
|
||||
"mianningxian": "冕宁县",
|
||||
"mianxian": "勉县",
|
||||
"mianyang": "绵阳",
|
||||
"mianyangshi": "绵阳",
|
||||
"mianzhu": "绵竹市",
|
||||
"mianzhushi": "绵竹市",
|
||||
"midongqu": "米东区",
|
||||
"miduxian": "弥渡县",
|
||||
"mile": "弥勒市",
|
||||
"mileshi": "弥勒市",
|
||||
"milinxian": "米林县",
|
||||
"miluo": "汨罗市",
|
||||
"miluoshi": "汨罗市",
|
||||
"minfengxian": "民丰县",
|
||||
"mingguang": "明光市",
|
||||
"mingguangshi": "明光市",
|
||||
"mingshuixian": "明水县",
|
||||
"mingxixian": "明溪县",
|
||||
"minhehuizutuzuzizhixian": "民和回族土族自治县",
|
||||
"minhouxian": "闽侯县",
|
||||
"minqingxian": "闽清县",
|
||||
"minqinxian": "民勤县",
|
||||
"minquanxian": "民权县",
|
||||
"minxian": "岷县",
|
||||
"minxingqu": "闵行区",
|
||||
"minyuexian": "民乐县",
|
||||
"mishan": "密山市",
|
||||
"mishanshi": "密山市",
|
||||
"miyixian": "米易县",
|
||||
"miyunqu": "密云区",
|
||||
"mizhixian": "米脂县",
|
||||
"mohe": "漠河市",
|
||||
"moheshi": "漠河市",
|
||||
"mojianghanizuzizhixian": "墨江哈尼族自治县",
|
||||
"molidawadawoerzuzizhiqi": "莫力达瓦达斡尔族自治旗",
|
||||
"motuoxian": "墨脱县",
|
||||
"moudingxian": "牟定县",
|
||||
"moyuxian": "墨玉县",
|
||||
"mozhugongkaxian": "墨竹工卡县",
|
||||
"muchuanxian": "沐川县",
|
||||
"mudanjiang": "牡丹江",
|
||||
"mudanjiangjingjijishukaifaqu": "牡丹江经济技术开发区",
|
||||
"mudanjiangshi": "牡丹江",
|
||||
"mudanqu": "牡丹区",
|
||||
"mulanxian": "木兰县",
|
||||
"muleihasakezizhixian": "木垒哈萨克自治县",
|
||||
"muleng": "穆棱市",
|
||||
"mulengshi": "穆棱市",
|
||||
"mulizangzuzizhixian": "木里藏族自治县",
|
||||
"mupingqu": "牟平区",
|
||||
"muyequ": "牧野区",
|
||||
"naidongqu": "乃东区",
|
||||
"naimanqi": "奈曼旗",
|
||||
"nanan": "南安市",
|
||||
"nananqu": "南岸区",
|
||||
"nananshi": "南安市",
|
||||
"nanaoxian": "南澳县",
|
||||
"nanbuxian": "南部县",
|
||||
"nanchang": "南昌",
|
||||
"nanchangshi": "南昌",
|
||||
"nanchangxian": "南昌县",
|
||||
"nanchaxian": "南岔县",
|
||||
"nanchengxian": "南城县",
|
||||
"nanchong": "南充",
|
||||
"nanchongshi": "南充",
|
||||
"nanchuanqu": "南川区",
|
||||
"nandanxian": "南丹县",
|
||||
"nanfengxian": "南丰县",
|
||||
"nanfenqu": "南芬区",
|
||||
"nangangqu": "南岗区",
|
||||
"nangong": "南宫市",
|
||||
"nangongshi": "南宫市",
|
||||
"nangqianxian": "囊谦县",
|
||||
"nanguanqu": "南关区",
|
||||
"nanhaiqu": "南海区",
|
||||
"nanhequ": "南和区",
|
||||
"nanhuaxian": "南华县",
|
||||
"nanhuqu": "南湖区",
|
||||
"nanjiangxian": "南江县",
|
||||
"nanjianyizuzizhixian": "南涧彝族自治县",
|
||||
"nanjing": "南京",
|
||||
"nanjingshi": "南京",
|
||||
"nanjingxian": "南靖县",
|
||||
"nankaiqu": "南开区",
|
||||
"nankangqu": "南康区",
|
||||
"nanlingxian": "南陵县",
|
||||
"nanmingqu": "南明区",
|
||||
"nanmulinxian": "南木林县",
|
||||
"nanning": "南宁",
|
||||
"nanningshi": "南宁",
|
||||
"nanpiaoqu": "南票区",
|
||||
"nanping": "南平",
|
||||
"nanpingshi": "南平",
|
||||
"nanpixian": "南皮县",
|
||||
"nanqiaoqu": "南谯区",
|
||||
"nanqu": "南区",
|
||||
"nanshanqu": "南山区",
|
||||
"nanshaqu": "南沙区",
|
||||
"nanshaqundao": "南沙群岛",
|
||||
"nantong": "南通",
|
||||
"nantongjingjijishukaifaqu": "南通经济技术开发区",
|
||||
"nantongshi": "南通",
|
||||
"nanxian": "南县",
|
||||
"nanxiong": "南雄市",
|
||||
"nanxiongshi": "南雄市",
|
||||
"nanxiqu": "南溪区",
|
||||
"nanxunqu": "南浔区",
|
||||
"nanyang": "南阳",
|
||||
"nanyanggaoxinjishuchanyekaifaqu": "南阳高新技术产业开发区",
|
||||
"nanyangshi": "南阳",
|
||||
"nanyangshichengxiangyitihuashifanqu": "南阳市城乡一体化示范区",
|
||||
"nanyuequ": "南岳区",
|
||||
"nanyuexian": "南乐县",
|
||||
"nanzhangxian": "南漳县",
|
||||
"nanzhaoxian": "南召县",
|
||||
"nanzhengqu": "南郑区",
|
||||
"napoxian": "那坡县",
|
||||
"naqu": "那曲",
|
||||
"naqushi": "那曲",
|
||||
"naxiqu": "纳溪区",
|
||||
"nayongxian": "纳雍县",
|
||||
"nehe": "讷河市",
|
||||
"neheshi": "讷河市",
|
||||
"neihuangxian": "内黄县",
|
||||
"neijiang": "内江",
|
||||
"neijiangjingjikaifaqu": "内江经济开发区",
|
||||
"neijiangshi": "内江",
|
||||
"neimenggualashangaoxinjishuchanyekaifaqu": "内蒙古阿拉善高新技术产业开发区",
|
||||
"neiqiuxian": "内丘县",
|
||||
"neixiangxian": "内乡县",
|
||||
"nenjiang": "嫩江市",
|
||||
"nenjiangshi": "嫩江市",
|
||||
"nianzishanqu": "碾子山区",
|
||||
"nielamuxian": "聂拉木县",
|
||||
"nierongxian": "聂荣县",
|
||||
"nileikexian": "尼勒克县",
|
||||
"nimaxian": "尼玛县",
|
||||
"nimuxian": "尼木县",
|
||||
"ningan": "宁安市",
|
||||
"ninganshi": "宁安市",
|
||||
"ningbo": "宁波",
|
||||
"ningboshi": "宁波",
|
||||
"ningchengxian": "宁城县",
|
||||
"ningde": "宁德",
|
||||
"ningdeshi": "宁德",
|
||||
"ningdouxian": "宁都县",
|
||||
"ningerhanizuyizuzizhixian": "宁洱哈尼族彝族自治县",
|
||||
"ningguo": "宁国市",
|
||||
"ningguoshi": "宁国市",
|
||||
"ninghaixian": "宁海县",
|
||||
"ninghequ": "宁河区",
|
||||
"ninghuaxian": "宁化县",
|
||||
"ningjiangqu": "宁江区",
|
||||
"ninglangyizuzizhixian": "宁蒗彝族自治县",
|
||||
"ninglingxian": "宁陵县",
|
||||
"ningmingxian": "宁明县",
|
||||
"ningnanxian": "宁南县",
|
||||
"ningqiangxian": "宁强县",
|
||||
"ningshanxian": "宁陕县",
|
||||
"ningwuxian": "宁武县",
|
||||
"ningxian": "宁县",
|
||||
"ningxiang": "宁乡市",
|
||||
"ningxiangshi": "宁乡市",
|
||||
"ningyangxian": "宁阳县",
|
||||
"ningyuanxian": "宁远县",
|
||||
"nonganxian": "农安县",
|
||||
"nujianglisuzu": "怒江傈僳族",
|
||||
"nujianglisuzuzizhizhou": "怒江傈僳族",
|
||||
"ouhaiqu": "瓯海区",
|
||||
"pananxian": "磐安县",
|
||||
"panjin": "盘锦",
|
||||
"panjinshi": "盘锦",
|
||||
"panjiqu": "潘集区",
|
||||
"panlongqu": "盘龙区",
|
||||
"panshanxian": "盘山县",
|
||||
"panshi": "磐石市",
|
||||
"panshishi": "磐石市",
|
||||
"panyuqu": "番禺区",
|
||||
"panzhihua": "攀枝花",
|
||||
"panzhihuashi": "攀枝花",
|
||||
"panzhou": "盘州市",
|
||||
"panzhoushi": "盘州市",
|
||||
"peixian": "沛县",
|
||||
"penganxian": "蓬安县",
|
||||
"pengjiangqu": "蓬江区",
|
||||
"penglaiqu": "蓬莱区",
|
||||
"pengshanqu": "彭山区",
|
||||
"pengshuimiaozutujiazuzizhixian": "彭水苗族土家族自治县",
|
||||
"pengxixian": "蓬溪县",
|
||||
"pengyangxian": "彭阳县",
|
||||
"pengzexian": "彭泽县",
|
||||
"pengzhou": "彭州市",
|
||||
"pengzhoushi": "彭州市",
|
||||
"pianguanxian": "偏关县",
|
||||
"pidouqu": "郫都区",
|
||||
"pinganqu": "平安区",
|
||||
"pingbaqu": "平坝区",
|
||||
"pingbianmiaozuzizhixian": "屏边苗族自治县",
|
||||
"pingchangxian": "平昌县",
|
||||
"pingchengqu": "平城区",
|
||||
"pingchuanqu": "平川区",
|
||||
"pingdingshan": "平顶山",
|
||||
"pingdingshangaoxinjishuchanyekaifaqu": "平顶山高新技术产业开发区",
|
||||
"pingdingshanshi": "平顶山",
|
||||
"pingdingshanshichengxiangyitihuashifanqu": "平顶山市城乡一体化示范区",
|
||||
"pingdingxian": "平定县",
|
||||
"pingdu": "平度市",
|
||||
"pingdushi": "平度市",
|
||||
"pingfangqu": "平房区",
|
||||
"pingguiqu": "平桂区",
|
||||
"pingguo": "平果市",
|
||||
"pingguoshi": "平果市",
|
||||
"pingguqu": "平谷区",
|
||||
"pinghexian": "平和县",
|
||||
"pinghu": "平湖市",
|
||||
"pinghushi": "平湖市",
|
||||
"pingjiangxian": "平江县",
|
||||
"pinglexian": "平乐县",
|
||||
"pingliang": "平凉",
|
||||
"pingliangshi": "平凉",
|
||||
"pinglixian": "平利县",
|
||||
"pingluoxian": "平罗县",
|
||||
"pingluqu": "平鲁区",
|
||||
"pingluxian": "平陆县",
|
||||
"pingqiaoqu": "平桥区",
|
||||
"pingquan": "平泉市",
|
||||
"pingquanshi": "平泉市",
|
||||
"pingshunxian": "平顺县",
|
||||
"pingtangxian": "平塘县",
|
||||
"pingtanxian": "平潭县",
|
||||
"pingwuxian": "平武县",
|
||||
"pingxiangxian": "平乡县",
|
||||
"pingyangxian": "平阳县",
|
||||
"pingyaoxian": "平遥县",
|
||||
"pingyinxian": "平阴县",
|
||||
"pingyixian": "平邑县",
|
||||
"pingyuxian": "平舆县",
|
||||
"pishanxian": "皮山县",
|
||||
"pizhou": "邳州市",
|
||||
"pizhoushi": "邳州市",
|
||||
"potou": "泊头市",
|
||||
"potouqu": "坡头区",
|
||||
"potoushi": "泊头市",
|
||||
"poyangxian": "鄱阳县",
|
||||
"puanxian": "普安县",
|
||||
"pubeixian": "浦北县",
|
||||
"pudingxian": "普定县",
|
||||
"pudongxinqu": "浦东新区",
|
||||
"puer": "普洱",
|
||||
"puershi": "普洱",
|
||||
"pugexian": "普格县",
|
||||
"pukouqu": "浦口区",
|
||||
"pulandianqu": "普兰店区",
|
||||
"pulanxian": "普兰县",
|
||||
"puning": "普宁市",
|
||||
"puningshi": "普宁市",
|
||||
"putian": "莆田",
|
||||
"putianshi": "莆田",
|
||||
"putuoqu": "普陀区",
|
||||
"puxian": "蒲县",
|
||||
"puyang": "濮阳",
|
||||
"puyangjingjijishukaifaqu": "濮阳经济技术开发区",
|
||||
"puyangshi": "濮阳",
|
||||
"puyangxian": "濮阳县",
|
||||
"qi": "麒麟区",
|
||||
"qianan": "迁安市",
|
||||
"qiananshi": "迁安市",
|
||||
"qiananxian": "乾安县",
|
||||
"qiandongnanmiaozudongzu": "黔东南苗族侗族",
|
||||
"qiandongnanmiaozudongzuzizhizhou": "黔东南苗族侗族",
|
||||
"qianfengqu": "前锋区",
|
||||
"qianguoerluosimengguzuzizhixian": "前郭尔罗斯蒙古族自治县",
|
||||
"qianjiang": "潜江市",
|
||||
"qianjiangqu": "黔江区",
|
||||
"qianjiangshi": "潜江市",
|
||||
"qianjinqu": "前进区",
|
||||
"qiannanbuyizumiaozu": "黔南布依族苗族",
|
||||
"qiannanbuyizumiaozuzizhizhou": "黔南布依族苗族",
|
||||
"qianshan": "潜山市",
|
||||
"qianshanqu": "千山区",
|
||||
"qianshanshi": "潜山市",
|
||||
"qiantangqu": "钱塘区",
|
||||
"qianweixian": "犍为县",
|
||||
"qianxi": "黔西市",
|
||||
"qianxian": "乾县",
|
||||
"qianxinanbuyizumiaozu": "黔西南布依族苗族",
|
||||
"qianxinanbuyizumiaozuzizhizhou": "黔西南布依族苗族",
|
||||
"qianxishi": "黔西市",
|
||||
"qianyangxian": "千阳县",
|
||||
"qiaochengqu": "谯城区",
|
||||
"qiaodongqu": "桥东区",
|
||||
"qiaojiaxian": "巧家县",
|
||||
"qiaokouqu": "硚口区",
|
||||
"qiaoxiqu": "桥西区",
|
||||
"qibinqu": "淇滨区",
|
||||
"qichunxian": "蕲春县",
|
||||
"qidong": "启东市",
|
||||
"qidongshi": "启东市",
|
||||
"qidongxian": "祁东县",
|
||||
"qiemoxian": "且末县",
|
||||
"qiezihequ": "茄子河区",
|
||||
"qihexian": "齐河县",
|
||||
"qijiangqu": "綦江区",
|
||||
"qilianxian": "祁连县",
|
||||
"qilihequ": "七里河区",
|
||||
"qilinqu": "麒麟区",
|
||||
"qimenxian": "祁门县",
|
||||
"qinanxian": "秦安县",
|
||||
"qinbeiqu": "钦北区",
|
||||
"qindouqu": "秦都区",
|
||||
"qinganxian": "庆安县",
|
||||
"qingbaijiangqu": "青白江区",
|
||||
"qingchengqu": "清城区",
|
||||
"qingchengxian": "庆城县",
|
||||
"qingchuanxian": "青川县",
|
||||
"qingdao": "青岛",
|
||||
"qingdaogaoxinjishuchanyekaifaqu": "青岛高新技术产业开发区",
|
||||
"qingdaoshi": "青岛",
|
||||
"qingfengxian": "清丰县",
|
||||
"qinggangxian": "青冈县",
|
||||
"qinghemenqu": "清河门区",
|
||||
"qinghequ": "清河区",
|
||||
"qingjiangpuqu": "清江浦区",
|
||||
"qingjianxian": "清涧县",
|
||||
"qingliuxian": "清流县",
|
||||
"qinglongmanzuzizhixian": "青龙满族自治县",
|
||||
"qinglongxian": "晴隆县",
|
||||
"qingpuqu": "青浦区",
|
||||
"qingshanhuqu": "青山湖区",
|
||||
"qingshanqu": "青山区",
|
||||
"qingshenxian": "青神县",
|
||||
"qingshuihexian": "清水河县",
|
||||
"qingshuixian": "清水县",
|
||||
"qingtianxian": "青田县",
|
||||
"qingtongxia": "青铜峡市",
|
||||
"qingtongxiashi": "青铜峡市",
|
||||
"qingxian": "青县",
|
||||
"qingxinqu": "清新区",
|
||||
"qingxiuqu": "青秀区",
|
||||
"qingxuxian": "清徐县",
|
||||
"qingyang": "庆阳",
|
||||
"qingyangqu": "青羊区",
|
||||
"qingyangshi": "庆阳",
|
||||
"qingyangxian": "青阳县",
|
||||
"qingyuan": "清远",
|
||||
"qingyuanmanzuzizhixian": "清原满族自治县",
|
||||
"qingyuanshi": "清远",
|
||||
"qingyuanxian": "庆元县",
|
||||
"qingyunpuqu": "青云谱区",
|
||||
"qingyunxian": "庆云县",
|
||||
"qingzhen": "清镇市",
|
||||
"qingzhenshi": "清镇市",
|
||||
"qingzhou": "青州市",
|
||||
"qingzhoushi": "青州市",
|
||||
"qinhuaiqu": "秦淮区",
|
||||
"qinhuangdao": "秦皇岛",
|
||||
"qinhuangdaoshi": "秦皇岛",
|
||||
"qinhuangdaoshijingjijishukaifaqu": "秦皇岛市经济技术开发区",
|
||||
"qinnanqu": "钦南区",
|
||||
"qinshuixian": "沁水县",
|
||||
"qinxian": "沁县",
|
||||
"qinyang": "沁阳市",
|
||||
"qinyangshi": "沁阳市",
|
||||
"qinyuanxian": "沁源县",
|
||||
"qinzhou": "钦州",
|
||||
"qinzhouqu": "秦州区",
|
||||
"qinzhoushi": "钦州",
|
||||
"qionghai": "琼海市",
|
||||
"qionghaishi": "琼海市",
|
||||
"qiongjiexian": "琼结县",
|
||||
"qionglai": "邛崃市",
|
||||
"qionglaishi": "邛崃市",
|
||||
"qiongshanqu": "琼山区",
|
||||
"qiongzhonglizumiaozuzizhixian": "琼中黎族苗族自治县",
|
||||
"qiqihaer": "齐齐哈尔",
|
||||
"qiqihaershi": "齐齐哈尔",
|
||||
"qishanxian": "岐山县",
|
||||
"qitaihe": "七台河",
|
||||
"qitaiheshi": "七台河",
|
||||
"qitaixian": "奇台县",
|
||||
"qiubeixian": "丘北县",
|
||||
"qiuxian": "邱县",
|
||||
"qixia": "栖霞市",
|
||||
"qixiaqu": "栖霞区",
|
||||
"qixiashi": "栖霞市",
|
||||
"qixingguanqu": "七星关区",
|
||||
"qixingqu": "七星区",
|
||||
"qiyang": "祁阳市",
|
||||
"qiyangshi": "祁阳市",
|
||||
"qiyangxian": "祁阳县",
|
||||
"quangangqu": "泉港区",
|
||||
"quanjiaoxian": "全椒县",
|
||||
"quannanxian": "全南县",
|
||||
"quanshanqu": "泉山区",
|
||||
"quanwanqu": "荃湾区",
|
||||
"quanzhou": "泉州",
|
||||
"quanzhoushi": "泉州",
|
||||
"quanzhouxian": "全州县",
|
||||
"queshanxian": "确山县",
|
||||
"qufu": "曲阜市",
|
||||
"qufushi": "曲阜市",
|
||||
"qujing": "曲靖",
|
||||
"qujingshi": "曲靖",
|
||||
"qumalaixian": "曲麻莱县",
|
||||
"qushuixian": "曲水县",
|
||||
"qusongxian": "曲松县",
|
||||
"quwoxian": "曲沃县",
|
||||
"quxian": "渠县",
|
||||
"quyangxian": "曲阳县",
|
||||
"quzhou": "衢州",
|
||||
"quzhoushi": "衢州",
|
||||
"quzhouxian": "曲周县",
|
||||
"ranghuluqu": "让胡路区",
|
||||
"rangtangxian": "壤塘县",
|
||||
"raohexian": "饶河县",
|
||||
"raopingxian": "饶平县",
|
||||
"raoyangxian": "饶阳县",
|
||||
"renbuxian": "仁布县",
|
||||
"renchengqu": "任城区",
|
||||
"renhequ": "仁和区",
|
||||
"renhuai": "仁怀市",
|
||||
"renhuaishi": "仁怀市",
|
||||
"renhuaxian": "仁化县",
|
||||
"renqiu": "任丘市",
|
||||
"renqiushi": "任丘市",
|
||||
"renshouxian": "仁寿县",
|
||||
"renzequ": "任泽区",
|
||||
"rikaze": "日喀则",
|
||||
"rikazeshi": "日喀则",
|
||||
"rituxian": "日土县",
|
||||
"rizhao": "日照",
|
||||
"rizhaojingjijishukaifaqu": "日照经济技术开发区",
|
||||
"rizhaoshi": "日照",
|
||||
"ronganxian": "融安县",
|
||||
"rongchangqu": "荣昌区",
|
||||
"rongcheng": "荣成市",
|
||||
"rongchengqu": "榕城区",
|
||||
"rongchengshi": "荣成市",
|
||||
"rongchengxian": "容城县",
|
||||
"rongjiangxian": "榕江县",
|
||||
"rongshuimiaozuzizhixian": "融水苗族自治县",
|
||||
"ruchengxian": "汝城县",
|
||||
"rudongxian": "如东县",
|
||||
"rugao": "如皋市",
|
||||
"rugaoshi": "如皋市",
|
||||
"ruian": "瑞安市",
|
||||
"ruianshi": "瑞安市",
|
||||
"ruichang": "瑞昌市",
|
||||
"ruichangshi": "瑞昌市",
|
||||
"ruichengxian": "芮城县",
|
||||
"ruijin": "瑞金市",
|
||||
"ruijinshi": "瑞金市",
|
||||
"ruili": "瑞丽市",
|
||||
"ruilishi": "瑞丽市",
|
||||
"runanxian": "汝南县",
|
||||
"runzhouqu": "润州区",
|
||||
"ruoergaixian": "若尔盖县",
|
||||
"ruoqiangxian": "若羌县",
|
||||
"rushan": "乳山市",
|
||||
"rushanshi": "乳山市",
|
||||
"ruyangxian": "汝阳县",
|
||||
"ruyuanyaozuzizhixian": "乳源瑶族自治县",
|
||||
"ruzhou": "汝州市",
|
||||
"ruzhoushi": "汝州市",
|
||||
"saertuqu": "萨尔图区",
|
||||
"sagaxian": "萨嘎县",
|
||||
"saihanqu": "赛罕区",
|
||||
"sajiaxian": "萨迦县",
|
||||
"sandoushuizuzizhixian": "三都水族自治县",
|
||||
"sangrixian": "桑日县",
|
||||
"sangzhixian": "桑植县",
|
||||
"sangzhuziqu": "桑珠孜区",
|
||||
"sanhe": "三河市",
|
||||
"sanheshi": "三河市",
|
||||
"sanjiangdongzuzizhixian": "三江侗族自治县",
|
||||
"sanmenxia": "三门峡",
|
||||
"sanmenxian": "三门县",
|
||||
"sanmenxiashi": "三门峡",
|
||||
"sanming": "三明",
|
||||
"sanmingshi": "三明",
|
||||
"sansha": "三沙",
|
||||
"sanshashi": "三沙",
|
||||
"sanshuiqu": "三水区",
|
||||
"sansuixian": "三穗县",
|
||||
"santaixian": "三台县",
|
||||
"sanya": "三亚",
|
||||
"sanyashi": "三亚",
|
||||
"sanyuanqu": "三元区",
|
||||
"sanyuanxian": "三原县",
|
||||
"sedaxian": "色达县",
|
||||
"seniqu": "色尼区",
|
||||
"shachexian": "莎车县",
|
||||
"shahe": "沙河市",
|
||||
"shahekouqu": "沙河口区",
|
||||
"shaheshi": "沙河市",
|
||||
"shanchengqu": "山城区",
|
||||
"shandanxian": "山丹县",
|
||||
"shangcaixian": "上蔡县",
|
||||
"shangchengqu": "上城区",
|
||||
"shangchengxian": "商城县",
|
||||
"shangdangqu": "上党区",
|
||||
"shangdouxian": "商都县",
|
||||
"shanggaoxian": "上高县",
|
||||
"shanghangxian": "上杭县",
|
||||
"shanghexian": "商河县",
|
||||
"shangjiequ": "上街区",
|
||||
"shanglinxian": "上林县",
|
||||
"shanglixian": "上栗县",
|
||||
"shangluo": "商洛",
|
||||
"shangluoshi": "商洛",
|
||||
"shangnanxian": "商南县",
|
||||
"shangqiu": "商丘",
|
||||
"shangqiushi": "商丘",
|
||||
"shangrao": "上饶",
|
||||
"shangraoshi": "上饶",
|
||||
"shangshuixian": "商水县",
|
||||
"shangsixian": "上思县",
|
||||
"shangyixian": "尚义县",
|
||||
"shangyouxian": "上犹县",
|
||||
"shangyuqu": "上虞区",
|
||||
"shangzhi": "尚志市",
|
||||
"shangzhishi": "尚志市",
|
||||
"shangzhouqu": "商州区",
|
||||
"shanhaiguanqu": "山海关区",
|
||||
"shannan": "山南",
|
||||
"shannanshi": "山南",
|
||||
"shanshanxian": "鄯善县",
|
||||
"shantingqu": "山亭区",
|
||||
"shantou": "汕头",
|
||||
"shantoushi": "汕头",
|
||||
"shanwei": "汕尾",
|
||||
"shanweishi": "汕尾",
|
||||
"shanxidatongjingjikaifaqu": "山西大同经济开发区",
|
||||
"shanxishuozhoujingjikaifaqu": "山西朔州经济开发区",
|
||||
"shanxizhangzhigaoxinjishuchanyeyuanqu": "山西长治高新技术产业园区",
|
||||
"shanxizhuanxingzonghegaigeshifanqu": "山西转型综合改革示范区",
|
||||
"shanyangqu": "山阳区",
|
||||
"shanyangxian": "山阳县",
|
||||
"shanyinxian": "山阴县",
|
||||
"shanzhouqu": "陕州区",
|
||||
"shaodong": "邵东市",
|
||||
"shaodongshi": "邵东市",
|
||||
"shaoguan": "韶关",
|
||||
"shaoguanshi": "韶关",
|
||||
"shaoshan": "韶山市",
|
||||
"shaoshanshi": "韶山市",
|
||||
"shaowu": "邵武市",
|
||||
"shaowushi": "邵武市",
|
||||
"shaoxing": "绍兴",
|
||||
"shaoxingshi": "绍兴",
|
||||
"shaoyang": "邵阳",
|
||||
"shaoyangshi": "邵阳",
|
||||
"shaoyangxian": "邵阳县",
|
||||
"shapingbaqu": "沙坪坝区",
|
||||
"shapotouqu": "沙坡头区",
|
||||
"shashiqu": "沙市区",
|
||||
"shatianqu": "沙田区",
|
||||
"shawan": "沙湾市",
|
||||
"shawanqu": "沙湾区",
|
||||
"shawanshi": "沙湾市",
|
||||
"shawanxian": "沙湾县",
|
||||
"shaxian": "沙县",
|
||||
"shaxianqu": "沙县区",
|
||||
"shayangxian": "沙洋县",
|
||||
"shayaxian": "沙雅县",
|
||||
"shayibakequ": "沙依巴克区",
|
||||
"shehong": "射洪市",
|
||||
"shehongshi": "射洪市",
|
||||
"shenbeixinqu": "沈北新区",
|
||||
"shenchixian": "神池县",
|
||||
"shenfang": "什邡市",
|
||||
"shenfangshi": "什邡市",
|
||||
"shengfangjigetangqu": "圣方济各堂区",
|
||||
"shengsixian": "嵊泗县",
|
||||
"shengzhou": "嵊州市",
|
||||
"shengzhoushi": "嵊州市",
|
||||
"shenhequ": "沈河区",
|
||||
"shenmu": "神木市",
|
||||
"shenmushi": "神木市",
|
||||
"shennongjia": "神农架林区",
|
||||
"shennongjialinqu": "神农架林区",
|
||||
"shenqiuxian": "沈丘县",
|
||||
"shenshuibuqu": "深水埗区",
|
||||
"shenxian": "莘县",
|
||||
"shenyang": "沈阳",
|
||||
"shenyangshi": "沈阳",
|
||||
"shenzexian": "深泽县",
|
||||
"shenzhaxian": "申扎县",
|
||||
"shenzhen": "深圳",
|
||||
"shenzhenshi": "深圳",
|
||||
"shenzhou": "深州市",
|
||||
"shenzhoushi": "深州市",
|
||||
"sheqixian": "社旗县",
|
||||
"sheyangxian": "射阳县",
|
||||
"shibeiqu": "市北区",
|
||||
"shibingxian": "施秉县",
|
||||
"shichengxian": "石城县",
|
||||
"shidianxian": "施甸县",
|
||||
"shifengqu": "石峰区",
|
||||
"shiguaiqu": "石拐区",
|
||||
"shiguqu": "石鼓区",
|
||||
"shihequ": "浉河区",
|
||||
"shihezi": "石河子市",
|
||||
"shihezishi": "石河子市",
|
||||
"shijiazhuang": "石家庄",
|
||||
"shijiazhuanggaoxinjishuchanyekaifaqu": "石家庄高新技术产业开发区",
|
||||
"shijiazhuangshi": "石家庄",
|
||||
"shijiazhuangxunhuanhuagongyuanqu": "石家庄循环化工园区",
|
||||
"shijingshanqu": "石景山区",
|
||||
"shilinyizuzizhixian": "石林彝族自治县",
|
||||
"shilongqu": "石龙区",
|
||||
"shilouxian": "石楼县",
|
||||
"shimenxian": "石门县",
|
||||
"shimianxian": "石棉县",
|
||||
"shinanqu": "市南区",
|
||||
"shipingxian": "石屏县",
|
||||
"shiqianxian": "石阡县",
|
||||
"shiquanxian": "石泉县",
|
||||
"shiquxian": "石渠县",
|
||||
"shishi": "石狮市",
|
||||
"shishishi": "石狮市",
|
||||
"shishou": "石首市",
|
||||
"shishoushi": "石首市",
|
||||
"shitaixian": "石台县",
|
||||
"shixiaqu": "市辖区",
|
||||
"shixingxian": "始兴县",
|
||||
"shiyan": "十堰",
|
||||
"shiyanshi": "十堰",
|
||||
"shizhongqu": "市中区",
|
||||
"shizhutujiazuzizhixian": "石柱土家族自治县",
|
||||
"shizongxian": "师宗县",
|
||||
"shizuishan": "石嘴山",
|
||||
"shizuishanshi": "石嘴山",
|
||||
"shouguang": "寿光市",
|
||||
"shouguangshi": "寿光市",
|
||||
"shouningxian": "寿宁县",
|
||||
"shouxian": "寿县",
|
||||
"shouyangxian": "寿阳县",
|
||||
"shuangbaixian": "双柏县",
|
||||
"shuangchengqu": "双城区",
|
||||
"shuangfengxian": "双峰县",
|
||||
"shuanghe": "双河市",
|
||||
"shuangheshi": "双河市",
|
||||
"shuanghuxian": "双湖县",
|
||||
"shuangjianglahuzuwazubulangzudaizuzizhixian": "双江拉祜族佤族布朗族傣族自治县",
|
||||
"shuangliao": "双辽市",
|
||||
"shuangliaoshi": "双辽市",
|
||||
"shuangliuqu": "双流区",
|
||||
"shuangluanqu": "双滦区",
|
||||
"shuangpaixian": "双牌县",
|
||||
"shuangqiaoqu": "双桥区",
|
||||
"shuangqingqu": "双清区",
|
||||
"shuangtaiziqu": "双台子区",
|
||||
"shuangtaqu": "双塔区",
|
||||
"shuangyangqu": "双阳区",
|
||||
"shuangyashan": "双鸭山",
|
||||
"shuangyashanshi": "双鸭山",
|
||||
"shuchengxian": "舒城县",
|
||||
"shufuxian": "疏附县",
|
||||
"shuichengqu": "水城区",
|
||||
"shuifu": "水富市",
|
||||
"shuifushi": "水富市",
|
||||
"shuimogouqu": "水磨沟区",
|
||||
"shulan": "舒兰市",
|
||||
"shulanshi": "舒兰市",
|
||||
"shulexian": "疏勒县",
|
||||
"shunchangxian": "顺昌县",
|
||||
"shunchengqu": "顺城区",
|
||||
"shundequ": "顺德区",
|
||||
"shunhehuizuqu": "顺河回族区",
|
||||
"shunpingxian": "顺平县",
|
||||
"shunqingqu": "顺庆区",
|
||||
"shunyiqu": "顺义区",
|
||||
"shuochengqu": "朔城区",
|
||||
"shuozhou": "朔州",
|
||||
"shuozhoushi": "朔州",
|
||||
"shushanqu": "蜀山区",
|
||||
"shuyangxian": "沭阳县",
|
||||
"sifangtaiqu": "四方台区",
|
||||
"sihongxian": "泗洪县",
|
||||
"sihui": "四会市",
|
||||
"sihuishi": "四会市",
|
||||
"simaoqu": "思茅区",
|
||||
"simingqu": "思明区",
|
||||
"sinanxian": "思南县",
|
||||
"siping": "四平",
|
||||
"sipingshi": "四平",
|
||||
"sishuixian": "泗水县",
|
||||
"sixian": "泗县",
|
||||
"siyangxian": "泗阳县",
|
||||
"siziwangqi": "四子王旗",
|
||||
"songbeiqu": "松北区",
|
||||
"songjiangqu": "松江区",
|
||||
"songlingqu": "松岭区",
|
||||
"songmingxian": "嵩明县",
|
||||
"songpanxian": "松潘县",
|
||||
"songshanqu": "松山区",
|
||||
"songtaomiaozuzizhixian": "松桃苗族自治县",
|
||||
"songxian": "嵩县",
|
||||
"songxixian": "松溪县",
|
||||
"songyangxian": "松阳县",
|
||||
"songyuan": "松原",
|
||||
"songyuanshi": "松原",
|
||||
"songzi": "松滋市",
|
||||
"songzishi": "松滋市",
|
||||
"subeimengguzuzizhixian": "肃北蒙古族自治县",
|
||||
"suchengqu": "宿城区",
|
||||
"suibinxian": "绥滨县",
|
||||
"suichangxian": "遂昌县",
|
||||
"suichuanxian": "遂川县",
|
||||
"suidexian": "绥德县",
|
||||
"suifenhe": "绥芬河市",
|
||||
"suifenheshi": "绥芬河市",
|
||||
"suihua": "绥化",
|
||||
"suihuashi": "绥化",
|
||||
"suijiangxian": "绥江县",
|
||||
"suilengxian": "绥棱县",
|
||||
"suining": "遂宁",
|
||||
"suiningshi": "遂宁",
|
||||
"suipingxian": "遂平县",
|
||||
"suiyangqu": "睢阳区",
|
||||
"suiyangxian": "绥阳县",
|
||||
"suizhongxian": "绥中县",
|
||||
"suizhou": "随州",
|
||||
"suizhoushi": "随州",
|
||||
"sujiatunqu": "苏家屯区",
|
||||
"sunanyuguzuzizhixian": "肃南裕固族自治县",
|
||||
"suningxian": "肃宁县",
|
||||
"suniteyouqi": "苏尼特右旗",
|
||||
"sunitezuoqi": "苏尼特左旗",
|
||||
"sunwuxian": "孙吴县",
|
||||
"suoxian": "索县",
|
||||
"suqian": "宿迁",
|
||||
"suqianjingjijishukaifaqu": "宿迁经济技术开发区",
|
||||
"suqianshi": "宿迁",
|
||||
"susongxian": "宿松县",
|
||||
"suxianqu": "苏仙区",
|
||||
"suyuqu": "宿豫区",
|
||||
"suzhougongyeyuanqu": "苏州工业园区",
|
||||
"suzhoujingjijishukaifaqu": "宿州经济技术开发区",
|
||||
"suzhoumaanshanxiandaichanyeyuanqu": "宿州马鞍山现代产业园区",
|
||||
"suzhouqu": "肃州区",
|
||||
"tachengdiqu": "塔城",
|
||||
"tachengshi": "塔城市",
|
||||
"tahe": "漯河",
|
||||
"tahejingjijishukaifaqu": "漯河经济技术开发区",
|
||||
"taheshi": "漯河",
|
||||
"tahexian": "塔河县",
|
||||
"taian": "泰安",
|
||||
"taianshi": "泰安",
|
||||
"taianxian": "台安县",
|
||||
"taibaixian": "太白县",
|
||||
"taicang": "太仓市",
|
||||
"taicangshi": "太仓市",
|
||||
"taierzhuangqu": "台儿庄区",
|
||||
"taiguqu": "太谷区",
|
||||
"taihequ": "太和区",
|
||||
"taihuxian": "太湖县",
|
||||
"taijiangqu": "台江区",
|
||||
"taijiangxian": "台江县",
|
||||
"taikangxian": "太康县",
|
||||
"tailaixian": "泰来县",
|
||||
"tainingxian": "泰宁县",
|
||||
"taipingqu": "太平区",
|
||||
"taipusiqi": "太仆寺旗",
|
||||
"taiqianxian": "台前县",
|
||||
"taishan": "台山市",
|
||||
"taishanqu": "泰山区",
|
||||
"taishanshi": "台山市",
|
||||
"taishunxian": "泰顺县",
|
||||
"taixing": "泰兴市",
|
||||
"taixingshi": "泰兴市",
|
||||
"taiyuan": "太原",
|
||||
"taiyuanshi": "太原",
|
||||
"taizhouyiyaogaoxinjishuchanyekaifaqu": "泰州医药高新技术产业开发区",
|
||||
"taizihequ": "太子河区",
|
||||
"tanchengxian": "郯城县",
|
||||
"tanghexian": "唐河县",
|
||||
"tangshan": "唐山",
|
||||
"tangshangaoxinjishuchanyekaifaqu": "唐山高新技术产业开发区",
|
||||
"tangshanshi": "唐山",
|
||||
"tangshanshihanguguanliqu": "唐山市汉沽管理区",
|
||||
"tangwangxian": "汤旺县",
|
||||
"tangxian": "唐县",
|
||||
"tangyinxian": "汤阴县",
|
||||
"tangyuanxian": "汤原县",
|
||||
"tantangqu": "覃塘区",
|
||||
"taobeiqu": "洮北区",
|
||||
"taochengqu": "桃城区",
|
||||
"taojiangxian": "桃江县",
|
||||
"taonan": "洮南市",
|
||||
"taonanshi": "洮南市",
|
||||
"taoshanqu": "桃山区",
|
||||
"taoyuanxian": "桃源县",
|
||||
"tashenkuergantajikezizhixian": "塔什库尔干塔吉克自治县",
|
||||
"tekesixian": "特克斯县",
|
||||
"tengchong": "腾冲市",
|
||||
"tengchongshi": "腾冲市",
|
||||
"tengxian": "藤县",
|
||||
"tengzhou": "滕州市",
|
||||
"tengzhoushi": "滕州市",
|
||||
"tiandengxian": "天等县",
|
||||
"tiandongxian": "田东县",
|
||||
"tianexian": "天峨县",
|
||||
"tianhequ": "天河区",
|
||||
"tianjiaanqu": "田家庵区",
|
||||
"tianjunxian": "天峻县",
|
||||
"tianlinxian": "田林县",
|
||||
"tianmen": "天门市",
|
||||
"tianmenshi": "天门市",
|
||||
"tianningqu": "天宁区",
|
||||
"tianqiaoqu": "天桥区",
|
||||
"tianquanxian": "天全县",
|
||||
"tianshanqu": "天山区",
|
||||
"tianshui": "天水",
|
||||
"tianshuishi": "天水",
|
||||
"tiantaixian": "天台县",
|
||||
"tianxinqu": "天心区",
|
||||
"tianyangqu": "田阳区",
|
||||
"tianyaqu": "天涯区",
|
||||
"tianyuanqu": "天元区",
|
||||
"tianzhang": "天长市",
|
||||
"tianzhangshi": "天长市",
|
||||
"tianzhenxian": "天镇县",
|
||||
"tianzhuxian": "天柱县",
|
||||
"tianzhuzangzuzizhixian": "天祝藏族自治县",
|
||||
"tiedongqu": "铁东区",
|
||||
"tiefengqu": "铁锋区",
|
||||
"tieli": "铁力市",
|
||||
"tieling": "铁岭",
|
||||
"tielingshi": "铁岭",
|
||||
"tielingxian": "铁岭县",
|
||||
"tielishi": "铁力市",
|
||||
"tiemenguan": "铁门关市",
|
||||
"tiemenguanshi": "铁门关市",
|
||||
"tieshangangqu": "铁山港区",
|
||||
"tieshanqu": "铁山区",
|
||||
"tiexiqu": "铁西区",
|
||||
"tinghuqu": "亭湖区",
|
||||
"tonganqu": "同安区",
|
||||
"tongbaixian": "桐柏县",
|
||||
"tongcheng": "桐城市",
|
||||
"tongchengshi": "桐城市",
|
||||
"tongchengxian": "通城县",
|
||||
"tongchuan": "铜川",
|
||||
"tongchuanqu": "通川区",
|
||||
"tongchuanshi": "铜川",
|
||||
"tongdaodongzuzizhixian": "通道侗族自治县",
|
||||
"tongdexian": "同德县",
|
||||
"tongguanqu": "铜官区",
|
||||
"tongguanxian": "潼关县",
|
||||
"tongguxian": "铜鼓县",
|
||||
"tonghaixian": "通海县",
|
||||
"tonghexian": "通河县",
|
||||
"tonghua": "通化",
|
||||
"tonghuashi": "通化",
|
||||
"tonghuaxian": "通化县",
|
||||
"tongjiang": "同江市",
|
||||
"tongjiangshi": "同江市",
|
||||
"tongjiangxian": "通江县",
|
||||
"tongliangqu": "铜梁区",
|
||||
"tongliao": "通辽",
|
||||
"tongliaojingjijishukaifaqu": "通辽经济技术开发区",
|
||||
"tongliaoshi": "通辽",
|
||||
"tongling": "铜陵",
|
||||
"tonglingshi": "铜陵",
|
||||
"tongluxian": "桐庐县",
|
||||
"tongnanqu": "潼南区",
|
||||
"tongshanqu": "铜山区",
|
||||
"tongshanxian": "通山县",
|
||||
"tongweixian": "通渭县",
|
||||
"tongxiang": "桐乡市",
|
||||
"tongxiangshi": "桐乡市",
|
||||
"tongxinxian": "同心县",
|
||||
"tongxuxian": "通许县",
|
||||
"tongyuxian": "通榆县",
|
||||
"tongzhouqu": "通州区",
|
||||
"tongzixian": "桐梓县",
|
||||
"toutunhequ": "头屯河区",
|
||||
"tuanfengxian": "团风县",
|
||||
"tulufan": "吐鲁番",
|
||||
"tulufanshi": "吐鲁番",
|
||||
"tumen": "图们市",
|
||||
"tumenshi": "图们市",
|
||||
"tumoteyouqi": "土默特右旗",
|
||||
"tumotezuoqi": "土默特左旗",
|
||||
"tumushuke": "图木舒克市",
|
||||
"tumushukeshi": "图木舒克市",
|
||||
"tunchangxian": "屯昌县",
|
||||
"tunliuqu": "屯留区",
|
||||
"tunmenqu": "屯门区",
|
||||
"tunxiqu": "屯溪区",
|
||||
"tuoketuoxian": "托克托县",
|
||||
"tuokexunxian": "托克逊县",
|
||||
"tuolixian": "托里县",
|
||||
"tuquanxian": "突泉县",
|
||||
"wafangdian": "瓦房店市",
|
||||
"wafangdianshi": "瓦房店市",
|
||||
"wananxian": "万安县",
|
||||
"wanbo": "万柏林区",
|
||||
"wanbolinqu": "万柏林区",
|
||||
"wanchengqu": "宛城区",
|
||||
"wangcangxian": "旺苍县",
|
||||
"wangchengqu": "望城区",
|
||||
"wangdetangqu": "望德堂区",
|
||||
"wangdouxian": "望都县",
|
||||
"wanghuaqu": "望花区",
|
||||
"wangjiangxian": "望江县",
|
||||
"wangkuixian": "望奎县",
|
||||
"wangmoxian": "望谟县",
|
||||
"wangqingxian": "汪清县",
|
||||
"wangyiqu": "王益区",
|
||||
"wannianxian": "万年县",
|
||||
"wanning": "万宁市",
|
||||
"wanningshi": "万宁市",
|
||||
"wanquanqu": "万全区",
|
||||
"wanrongxian": "万荣县",
|
||||
"wanshanqu": "万山区",
|
||||
"wanxiuqu": "万秀区",
|
||||
"wanyuan": "万源市",
|
||||
"wanyuanshi": "万源市",
|
||||
"wanzaiqu": "湾仔区",
|
||||
"wanzaixian": "万载县",
|
||||
"wanzhiqu": "湾沚区",
|
||||
"wanzhouqu": "万州区",
|
||||
"weichangmanzumengguzuzizhixian": "围场满族蒙古族自治县",
|
||||
"weidongqu": "卫东区",
|
||||
"weidouqu": "魏都区",
|
||||
"weifang": "潍坊",
|
||||
"weifangbinhaijingjijishukaifaqu": "潍坊滨海经济技术开发区",
|
||||
"weifangshi": "潍坊",
|
||||
"weihai": "威海",
|
||||
"weihaihuojugaojishuchanyekaifaqu": "威海火炬高技术产业开发区",
|
||||
"weihaijingjijishukaifaqu": "威海经济技术开发区",
|
||||
"weihailingangjingjijishukaifaqu": "威海临港经济技术开发区",
|
||||
"weihaishi": "威海",
|
||||
"weihui": "卫辉市",
|
||||
"weihuishi": "卫辉市",
|
||||
"weinan": "渭南",
|
||||
"weinanshi": "渭南",
|
||||
"weiningyizuhuizumiaozuzizhixian": "威宁彝族回族苗族自治县",
|
||||
"weishanxian": "微山县",
|
||||
"weishanyizuhuizuzizhixian": "巍山彝族回族自治县",
|
||||
"weishixian": "尉氏县",
|
||||
"weixilisuzuzizhixian": "维西傈僳族自治县",
|
||||
"weixinxian": "威信县",
|
||||
"weiyangqu": "未央区",
|
||||
"wenanxian": "文安县",
|
||||
"wenchang": "文昌市",
|
||||
"wenchangshi": "文昌市",
|
||||
"wenchengxian": "文成县",
|
||||
"wenchuanxian": "汶川县",
|
||||
"wendengqu": "文登区",
|
||||
"wenfengqu": "文峰区",
|
||||
"wenganxian": "瓮安县",
|
||||
"wengniuteqi": "翁牛特旗",
|
||||
"wengyuanxian": "翁源县",
|
||||
"wenjiangqu": "温江区",
|
||||
"wenling": "温岭市",
|
||||
"wenlingshi": "温岭市",
|
||||
"wenquanxian": "温泉县",
|
||||
"wenshan": "文山市",
|
||||
"wenshangxian": "汶上县",
|
||||
"wenshanshi": "文山市",
|
||||
"wenshanzhuangzumiaozu": "文山壮族苗族",
|
||||
"wenshanzhuangzumiaozuzizhizhou": "文山壮族苗族",
|
||||
"wenshengqu": "文圣区",
|
||||
"wenshuixian": "文水县",
|
||||
"wensuxian": "温宿县",
|
||||
"wenxixian": "闻喜县",
|
||||
"wenzhou": "温州",
|
||||
"wenzhoujingjijishukaifaqu": "温州经济技术开发区",
|
||||
"wenzhoushi": "温州",
|
||||
"wolongqu": "卧龙区",
|
||||
"woyangxian": "涡阳县",
|
||||
"wuan": "武安市",
|
||||
"wuanshi": "武安市",
|
||||
"wubuxian": "吴堡县",
|
||||
"wuchang": "五常市",
|
||||
"wuchangqu": "武昌区",
|
||||
"wuchangshi": "五常市",
|
||||
"wuchengqu": "婺城区",
|
||||
"wuchengxian": "武城县",
|
||||
"wuchuan": "吴川市",
|
||||
"wuchuangelaozumiaozuzizhixian": "务川仡佬族苗族自治县",
|
||||
"wuchuanshi": "吴川市",
|
||||
"wuchuanxian": "武川县",
|
||||
"wucuiqu": "乌翠区",
|
||||
"wudalianchi": "五大连池市",
|
||||
"wudalianchishi": "五大连池市",
|
||||
"wudangqu": "乌当区",
|
||||
"wudaqu": "乌达区",
|
||||
"wudingxian": "武定县",
|
||||
"wudixian": "无棣县",
|
||||
"wudouqu": "武都区",
|
||||
"wuerhequ": "乌尔禾区",
|
||||
"wufengtujiazuzizhixian": "五峰土家族自治县",
|
||||
"wugongxian": "武功县",
|
||||
"wuhai": "乌海",
|
||||
"wuhaishi": "乌海",
|
||||
"wuhan": "武汉",
|
||||
"wuhanshi": "武汉",
|
||||
"wuhexian": "五河县",
|
||||
"wuhouqu": "武侯区",
|
||||
"wuhu": "芜湖",
|
||||
"wuhuaqu": "五华区",
|
||||
"wuhuaxian": "五华县",
|
||||
"wuhujingjijishukaifaqu": "芜湖经济技术开发区",
|
||||
"wuhushi": "芜湖",
|
||||
"wujiagangqu": "伍家岗区",
|
||||
"wujiaqu": "五家渠市",
|
||||
"wujiaqushi": "五家渠市",
|
||||
"wujinqu": "武进区",
|
||||
"wujixian": "无极县",
|
||||
"wulagaiguanweihui": "乌拉盖管委会",
|
||||
"wulanchabu": "乌兰察布",
|
||||
"wulanchabushi": "乌兰察布",
|
||||
"wulanhaote": "乌兰浩特市",
|
||||
"wulanhaoteshi": "乌兰浩特市",
|
||||
"wulanxian": "乌兰县",
|
||||
"wulatehouqi": "乌拉特后旗",
|
||||
"wulateqianqi": "乌拉特前旗",
|
||||
"wulatezhongqi": "乌拉特中旗",
|
||||
"wulianxian": "五莲县",
|
||||
"wulingqu": "武陵区",
|
||||
"wulingyuanqu": "武陵源区",
|
||||
"wulongqu": "武隆区",
|
||||
"wulumuqi": "乌鲁木齐",
|
||||
"wulumuqishi": "乌鲁木齐",
|
||||
"wulumuqixian": "乌鲁木齐县",
|
||||
"wumingqu": "武鸣区",
|
||||
"wuningxian": "武宁县",
|
||||
"wupingxian": "武平县",
|
||||
"wuqiangxian": "武强县",
|
||||
"wuqiaoxian": "吴桥县",
|
||||
"wuqiaxian": "乌恰县",
|
||||
"wuqingqu": "武清区",
|
||||
"wuqixian": "吴起县",
|
||||
"wushengxian": "武胜县",
|
||||
"wushenqi": "乌审旗",
|
||||
"wushenxian": "乌什县",
|
||||
"wusu": "乌苏市",
|
||||
"wusushi": "乌苏市",
|
||||
"wutaishanfengjingmingshengqu": "五台山风景名胜区",
|
||||
"wutaixian": "五台县",
|
||||
"wutongqiaoqu": "五通桥区",
|
||||
"wuxi": "无锡",
|
||||
"wuxiangxian": "武乡县",
|
||||
"wuxingqu": "吴兴区",
|
||||
"wuxishi": "无锡",
|
||||
"wuxixian": "巫溪县",
|
||||
"wuxuanxian": "武宣县",
|
||||
"wuxue": "武穴市",
|
||||
"wuxueshi": "武穴市",
|
||||
"wuyangxian": "舞阳县",
|
||||
"wuyishan": "武夷山市",
|
||||
"wuyishanshi": "武夷山市",
|
||||
"wuzhaixian": "五寨县",
|
||||
"wuzhishan": "五指山市",
|
||||
"wuzhishanshi": "五指山市",
|
||||
"wuzhixian": "武陟县",
|
||||
"wuzhong": "吴忠",
|
||||
"wuzhongqu": "吴中区",
|
||||
"wuzhongshi": "吴忠",
|
||||
"wuzhou": "梧州",
|
||||
"wuzhoushi": "梧州",
|
||||
"xiachengqu": "下城区",
|
||||
"xiahexian": "夏河县",
|
||||
"xiahuayuanqu": "下花园区",
|
||||
"xiajiangxian": "峡江县",
|
||||
"xiajinxian": "夏津县",
|
||||
"xialuqu": "下陆区",
|
||||
"xiamen": "厦门",
|
||||
"xiamenshi": "厦门",
|
||||
"xian": "西安",
|
||||
"xiananqu": "咸安区",
|
||||
"xianfengxian": "咸丰县",
|
||||
"xianganqu": "翔安区",
|
||||
"xiangcheng": "项城市",
|
||||
"xiangchengshi": "项城市",
|
||||
"xiangdongqu": "湘东区",
|
||||
"xiangdouqu": "襄都区",
|
||||
"xiangfangqu": "香坊区",
|
||||
"xiangfenxian": "襄汾县",
|
||||
"xiangfuqu": "祥符区",
|
||||
"xianggelila": "香格里拉市",
|
||||
"xianggelilashi": "香格里拉市",
|
||||
"xianghexian": "香河县",
|
||||
"xianghuangqi": "镶黄旗",
|
||||
"xiangningxian": "乡宁县",
|
||||
"xiangqiaoqu": "湘桥区",
|
||||
"xiangshanxian": "象山县",
|
||||
"xiangshuixian": "响水县",
|
||||
"xiangtan": "湘潭",
|
||||
"xiangtanjiuhuashifanqu": "湘潭九华示范区",
|
||||
"xiangtanshi": "湘潭",
|
||||
"xiangtanxian": "湘潭县",
|
||||
"xiangtanzhaoshanshifanqu": "湘潭昭山示范区",
|
||||
"xiangxiang": "湘乡市",
|
||||
"xiangxiangshi": "湘乡市",
|
||||
"xiangxitujiazumiaozu": "湘西土家族苗族",
|
||||
"xiangxitujiazumiaozuzizhizhou": "湘西土家族苗族",
|
||||
"xiangyang": "襄阳",
|
||||
"xiangyangqu": "向阳区",
|
||||
"xiangyangshi": "襄阳",
|
||||
"xiangyinxian": "湘阴县",
|
||||
"xiangyuanxian": "襄垣县",
|
||||
"xiangyunxian": "祥云县",
|
||||
"xiangzhouxian": "象州县",
|
||||
"xianjuxian": "仙居县",
|
||||
"xianning": "咸宁",
|
||||
"xianningshi": "咸宁",
|
||||
"xianqu": "西安区",
|
||||
"xianshi": "西安",
|
||||
"xiantao": "仙桃市",
|
||||
"xiantaoshi": "仙桃市",
|
||||
"xianxian": "献县",
|
||||
"xianyang": "咸阳",
|
||||
"xianyangshi": "咸阳",
|
||||
"xianyouxian": "仙游县",
|
||||
"xiaochangxian": "孝昌县",
|
||||
"xiaodianqu": "小店区",
|
||||
"xiaogan": "孝感",
|
||||
"xiaoganshi": "孝感",
|
||||
"xiaojinxian": "小金县",
|
||||
"xiaonanqu": "孝南区",
|
||||
"xiaoshanqu": "萧山区",
|
||||
"xiaotingqu": "猇亭区",
|
||||
"xiaoxian": "萧县",
|
||||
"xiaoyi": "孝义市",
|
||||
"xiaoyishi": "孝义市",
|
||||
"xiapuxian": "霞浦县",
|
||||
"xiashanqu": "霞山区",
|
||||
"xiaxian": "夏县",
|
||||
"xiayixian": "夏邑县",
|
||||
"xichang": "西昌市",
|
||||
"xichangshi": "西昌市",
|
||||
"xichengqu": "西城区",
|
||||
"xichongxian": "西充县",
|
||||
"xichouxian": "西畴县",
|
||||
"xichuanxian": "淅川县",
|
||||
"xidexian": "喜德县",
|
||||
"xiejiajiqu": "谢家集区",
|
||||
"xietongmenxian": "谢通门县",
|
||||
"xifengqu": "西峰区",
|
||||
"xigangqu": "西岗区",
|
||||
"xiguqu": "西固区",
|
||||
"xihequ": "细河区",
|
||||
"xihexian": "西和县",
|
||||
"xihuaxian": "西华县",
|
||||
"xijixian": "西吉县",
|
||||
"xilingqu": "西陵区",
|
||||
"xilinguolei": "锡林郭勒",
|
||||
"xilinguoleimeng": "锡林郭勒",
|
||||
"xilinhaote": "锡林浩特市",
|
||||
"xilinhaoteshi": "锡林浩特市",
|
||||
"xilinxian": "西林县",
|
||||
"ximengwazuzizhixian": "西盟佤族自治县",
|
||||
"xin": "新林区",
|
||||
"xinanxian": "新安县",
|
||||
"xinbaerhuyouqi": "新巴尔虎右旗",
|
||||
"xinbaerhuzuoqi": "新巴尔虎左旗",
|
||||
"xinbeiqu": "新北区",
|
||||
"xinbinmanzuzizhixian": "新宾满族自治县",
|
||||
"xincaixian": "新蔡县",
|
||||
"xinchangxian": "新昌县",
|
||||
"xinchengqu": "新城区",
|
||||
"xinchengxian": "忻城县",
|
||||
"xingan": "兴安",
|
||||
"xinganmeng": "兴安",
|
||||
"xinganqu": "兴安区",
|
||||
"xingbinqu": "兴宾区",
|
||||
"xingcheng": "兴城市",
|
||||
"xingchengshi": "兴城市",
|
||||
"xingguoxian": "兴国县",
|
||||
"xinghaixian": "兴海县",
|
||||
"xinghexian": "兴和县",
|
||||
"xinghua": "兴化市",
|
||||
"xinghualingqu": "杏花岭区",
|
||||
"xinghuashi": "兴化市",
|
||||
"xingjingxian": "荥经县",
|
||||
"xinglongtaiqu": "兴隆台区",
|
||||
"xinglongxian": "兴隆县",
|
||||
"xingning": "兴宁市",
|
||||
"xingningqu": "兴宁区",
|
||||
"xingningshi": "兴宁市",
|
||||
"xingping": "兴平市",
|
||||
"xingpingshi": "兴平市",
|
||||
"xingqingqu": "兴庆区",
|
||||
"xingren": "兴仁市",
|
||||
"xingrenshi": "兴仁市",
|
||||
"xingshanqu": "兴山区",
|
||||
"xingshanxian": "兴山县",
|
||||
"xingtai": "邢台",
|
||||
"xingtaishi": "邢台",
|
||||
"xingtangxian": "行唐县",
|
||||
"xingwenxian": "兴文县",
|
||||
"xingxian": "兴县",
|
||||
"xingyang": "荥阳市",
|
||||
"xingyangshi": "荥阳市",
|
||||
"xingyexian": "兴业县",
|
||||
"xingyi": "兴义市",
|
||||
"xingyishi": "兴义市",
|
||||
"xinhuangdongzuzizhixian": "新晃侗族自治县",
|
||||
"xinhuaqu": "新华区",
|
||||
"xinhuaxian": "新化县",
|
||||
"xinhuiqu": "新会区",
|
||||
"xining": "西宁",
|
||||
"xiningshi": "西宁",
|
||||
"xinji": "辛集市",
|
||||
"xinjiangweiwuerzizhiquzizhiquzhixiaxianjixingzhengquhua": "新疆维吾尔自治区-自治区直辖县级行政区划",
|
||||
"xinjiangxian": "新绛县",
|
||||
"xinjianqu": "新建区",
|
||||
"xinjinqu": "新津区",
|
||||
"xinjishi": "辛集市",
|
||||
"xinle": "新乐市",
|
||||
"xinleshi": "新乐市",
|
||||
"xinlinqu": "新林区",
|
||||
"xinlongxian": "新龙县",
|
||||
"xinluoqu": "新罗区",
|
||||
"xinmi": "新密市",
|
||||
"xinmin": "新民市",
|
||||
"xinminshi": "新民市",
|
||||
"xinmishi": "新密市",
|
||||
"xinningxian": "新宁县",
|
||||
"xinpingyizudaizuzizhixian": "新平彝族傣族自治县",
|
||||
"xinqiuqu": "新邱区",
|
||||
"xinrongqu": "新荣区",
|
||||
"xinshaoxian": "新邵县",
|
||||
"xinshiqu": "新市区",
|
||||
"xintai": "新泰市",
|
||||
"xintaishi": "新泰市",
|
||||
"xintianxian": "新田县",
|
||||
"xinwuqu": "新吴区",
|
||||
"xinxian": "新县",
|
||||
"xinxiang": "新乡",
|
||||
"xinxianggaoxinjishuchanyekaifaqu": "新乡高新技术产业开发区",
|
||||
"xinxiangjingjijishukaifaqu": "新乡经济技术开发区",
|
||||
"xinxiangshi": "新乡",
|
||||
"xinxiangshipingyuanchengxiangyitihuashifanqu": "新乡市平原城乡一体化示范区",
|
||||
"xinxiangxian": "新乡县",
|
||||
"xinxing": "新星市",
|
||||
"xinxingqu": "新兴区",
|
||||
"xinxingshi": "新星市",
|
||||
"xinxingxian": "新兴县",
|
||||
"xinyang": "信阳",
|
||||
"xinyanggaoxinjishuchanyekaifaqu": "信阳高新技术产业开发区",
|
||||
"xinyangshi": "信阳",
|
||||
"xinyexian": "新野县",
|
||||
"xinyu": "新余",
|
||||
"xinyuanxian": "新源县",
|
||||
"xinyushi": "新余",
|
||||
"xinzheng": "新郑市",
|
||||
"xinzhengshi": "新郑市",
|
||||
"xinzhou": "忻州",
|
||||
"xinzhoushi": "忻州",
|
||||
"xiongxian": "雄县",
|
||||
"xipingxian": "西平县",
|
||||
"xiqingqu": "西青区",
|
||||
"xiqu": "西区",
|
||||
"xisaishanqu": "西塞山区",
|
||||
"xishaqundao": "西沙群岛",
|
||||
"xishiqu": "西市区",
|
||||
"xishuangbannadaizu": "西双版纳傣族",
|
||||
"xishuangbannadaizuzizhizhou": "西双版纳傣族",
|
||||
"xiufengqu": "秀峰区",
|
||||
"xiuningxian": "休宁县",
|
||||
"xiushantujiazumiaozuzizhixian": "秀山土家族苗族自治县",
|
||||
"xiushuixian": "修水县",
|
||||
"xiuwenxian": "修文县",
|
||||
"xiuwuxian": "修武县",
|
||||
"xiuyanmanzuzizhixian": "岫岩满族自治县",
|
||||
"xiuyingqu": "秀英区",
|
||||
"xiuyuqu": "秀屿区",
|
||||
"xiuzhouqu": "秀洲区",
|
||||
"xiwuzhumuqinqi": "西乌珠穆沁旗",
|
||||
"xixiangtangqu": "西乡塘区",
|
||||
"xixiangxian": "西乡县",
|
||||
"xixiaqu": "西夏区",
|
||||
"xixiaxian": "西峡县",
|
||||
"xixiuqu": "西秀区",
|
||||
"xiyangxian": "昔阳县",
|
||||
"xizangwenhualvyouchuangyiyuanqu": "西藏文化旅游创意园区",
|
||||
"xuancheng": "宣城",
|
||||
"xuanchengshi": "宣城",
|
||||
"xuanchengshijingjikaifaqu": "宣城市经济开发区",
|
||||
"xuanenxian": "宣恩县",
|
||||
"xuanhanxian": "宣汉县",
|
||||
"xuanhuaqu": "宣化区",
|
||||
"xuanwei": "宣威市",
|
||||
"xuanweishi": "宣威市",
|
||||
"xuanwuqu": "玄武区",
|
||||
"xuanzhouqu": "宣州区",
|
||||
"xuchang": "许昌",
|
||||
"xuchangjingjijishukaifaqu": "许昌经济技术开发区",
|
||||
"xuchangshi": "许昌",
|
||||
"xuechengqu": "薛城区",
|
||||
"xuhuiqu": "徐汇区",
|
||||
"xundianhuizuyizuzizhixian": "寻甸回族彝族自治县",
|
||||
"xunhuasalazuzizhixian": "循化撒拉族自治县",
|
||||
"xunkexian": "逊克县",
|
||||
"xunwuxian": "寻乌县",
|
||||
"xunyang": "旬阳市",
|
||||
"xunyangqu": "浔阳区",
|
||||
"xunyangshi": "旬阳市",
|
||||
"xunyangxian": "旬阳县",
|
||||
"xunyixian": "旬邑县",
|
||||
"xupuxian": "溆浦县",
|
||||
"xushuiqu": "徐水区",
|
||||
"xuwenxian": "徐闻县",
|
||||
"xuyixian": "盱眙县",
|
||||
"xuyongxian": "叙永县",
|
||||
"xuzhou": "徐州",
|
||||
"xuzhoujingjijishukaifaqu": "徐州经济技术开发区",
|
||||
"xuzhouqu": "叙州区",
|
||||
"xuzhoushi": "徐州",
|
||||
"yaan": "雅安",
|
||||
"yaanshi": "雅安",
|
||||
"yadongxian": "亚东县",
|
||||
"yajiangxian": "雅江县",
|
||||
"yakeshi": "牙克石市",
|
||||
"yakeshishi": "牙克石市",
|
||||
"yanan": "延安",
|
||||
"yananshi": "延安",
|
||||
"yanbianchaoxianzu": "延边朝鲜族",
|
||||
"yanbianchaoxianzuzizhizhou": "延边朝鲜族",
|
||||
"yanbianxian": "盐边县",
|
||||
"yanchangxian": "延长县",
|
||||
"yancheng": "盐城",
|
||||
"yanchengjingjijishukaifaqu": "盐城经济技术开发区",
|
||||
"yanchengqu": "郾城区",
|
||||
"yanchengshi": "盐城",
|
||||
"yanchixian": "盐池县",
|
||||
"yanchuanxian": "延川县",
|
||||
"yandouqu": "盐都区",
|
||||
"yanfengqu": "雁峰区",
|
||||
"yangbiyizuzizhixian": "漾濞彝族自治县",
|
||||
"yangchengxian": "阳城县",
|
||||
"yangchun": "阳春市",
|
||||
"yangchunshi": "阳春市",
|
||||
"yangdongqu": "阳东区",
|
||||
"yanggaoxian": "阳高县",
|
||||
"yangguxian": "阳谷县",
|
||||
"yangjiang": "阳江",
|
||||
"yangjiangshi": "阳江",
|
||||
"yanglingqu": "杨陵区",
|
||||
"yangmingqu": "阳明区",
|
||||
"yangpuqu": "杨浦区",
|
||||
"yangquan": "阳泉",
|
||||
"yangquanshi": "阳泉",
|
||||
"yangquxian": "阳曲县",
|
||||
"yangshanxian": "阳山县",
|
||||
"yangshuoxian": "阳朔县",
|
||||
"yangxian": "洋县",
|
||||
"yangxixian": "阳西县",
|
||||
"yangyuanxian": "阳原县",
|
||||
"yangzhong": "扬中市",
|
||||
"yangzhongshi": "扬中市",
|
||||
"yangzhou": "扬州",
|
||||
"yangzhoujingjijishukaifaqu": "扬州经济技术开发区",
|
||||
"yangzhoushi": "扬州",
|
||||
"yanhetujiazuzizhixian": "沿河土家族自治县",
|
||||
"yanhuqu": "盐湖区",
|
||||
"yanji": "延吉市",
|
||||
"yanjiangqu": "雁江区",
|
||||
"yanjishi": "延吉市",
|
||||
"yanliangqu": "阎良区",
|
||||
"yanpingqu": "延平区",
|
||||
"yanqihuizuzizhixian": "焉耆回族自治县",
|
||||
"yanqingqu": "延庆区",
|
||||
"yanshanqu": "雁山区",
|
||||
"yanshi": "偃师市",
|
||||
"yanshiqu": "偃师区",
|
||||
"yanshishi": "偃师市",
|
||||
"yanshouxian": "延寿县",
|
||||
"yantai": "烟台",
|
||||
"yantaigaoxinjishuchanyekaifaqu": "烟台高新技术产业开发区",
|
||||
"yantaijingjijishukaifaqu": "烟台经济技术开发区",
|
||||
"yantaishi": "烟台",
|
||||
"yantanqu": "沿滩区",
|
||||
"yantaqu": "雁塔区",
|
||||
"yantianqu": "盐田区",
|
||||
"yantingxian": "盐亭县",
|
||||
"yanyuanxian": "盐源县",
|
||||
"yanzhouqu": "兖州区",
|
||||
"yaoanxian": "姚安县",
|
||||
"yaodouqu": "尧都区",
|
||||
"yaohaiqu": "瑶海区",
|
||||
"yaozhouqu": "耀州区",
|
||||
"yazhouqu": "崖州区",
|
||||
"yechengxian": "叶城县",
|
||||
"yejiqu": "叶集区",
|
||||
"yexian": "叶县",
|
||||
"yianqu": "义安区",
|
||||
"yianxian": "依安县",
|
||||
"yibin": "宜宾",
|
||||
"yibinshi": "宜宾",
|
||||
"yichang": "宜昌",
|
||||
"yichangshi": "宜昌",
|
||||
"yicheng": "宜城市",
|
||||
"yichengshi": "宜城市",
|
||||
"yichengxian": "翼城县",
|
||||
"yidu": "宜都市",
|
||||
"yidushi": "宜都市",
|
||||
"yifengxian": "宜丰县",
|
||||
"yihuangxian": "宜黄县",
|
||||
"yijiangqu": "弋江区",
|
||||
"yijinhuoluoqi": "伊金霍洛旗",
|
||||
"yijunxian": "宜君县",
|
||||
"yilanxian": "依兰县",
|
||||
"yilihasake": "伊犁哈萨克",
|
||||
"yilihasakezizhizhou": "伊犁哈萨克",
|
||||
"yilingqu": "夷陵区",
|
||||
"yilongxian": "仪陇县",
|
||||
"yima": "义马市",
|
||||
"yimashi": "义马市",
|
||||
"yimeiqu": "伊美区",
|
||||
"yimenxian": "易门县",
|
||||
"yinanxian": "沂南县",
|
||||
"yinchuan": "银川",
|
||||
"yinchuanshi": "银川",
|
||||
"yindouqu": "殷都区",
|
||||
"yingcheng": "应城市",
|
||||
"yingchengshi": "应城市",
|
||||
"yingde": "英德市",
|
||||
"yingdeshi": "英德市",
|
||||
"yingdongqu": "颍东区",
|
||||
"yingjiangqu": "迎江区",
|
||||
"yingjiangxian": "盈江县",
|
||||
"yingjishaxian": "英吉沙县",
|
||||
"yingkou": "营口",
|
||||
"yingkoushi": "营口",
|
||||
"yingquanqu": "颍泉区",
|
||||
"yingshangxian": "颍上县",
|
||||
"yingshouyingzikuangqu": "鹰手营子矿区",
|
||||
"yingtan": "鹰潭",
|
||||
"yingtanshi": "鹰潭",
|
||||
"yingxian": "应县",
|
||||
"yingzequ": "迎泽区",
|
||||
"yingzhouqu": "颍州区",
|
||||
"yinhaiqu": "银海区",
|
||||
"yining": "伊宁市",
|
||||
"yiningshi": "伊宁市",
|
||||
"yiningxian": "伊宁县",
|
||||
"yinjiangtujiazumiaozuzizhixian": "印江土家族苗族自治县",
|
||||
"yintaiqu": "印台区",
|
||||
"yishuixian": "沂水县",
|
||||
"yitongmanzuzizhixian": "伊通满族自治县",
|
||||
"yiwu": "义乌市",
|
||||
"yiwushi": "义乌市",
|
||||
"yiwuxian": "伊吾县",
|
||||
"yixing": "宜兴市",
|
||||
"yixingshi": "宜兴市",
|
||||
"yixiuqu": "宜秀区",
|
||||
"yiyang": "益阳",
|
||||
"yiyangshi": "益阳",
|
||||
"yiyangshidatonghuguanliqu": "益阳市大通湖管理区",
|
||||
"yiyuanxian": "沂源县",
|
||||
"yizhangxian": "宜章县",
|
||||
"yizheng": "仪征市",
|
||||
"yizhengshi": "仪征市",
|
||||
"yongan": "永安市",
|
||||
"yonganshi": "永安市",
|
||||
"yongchangxian": "永昌县",
|
||||
"yongcheng": "永城市",
|
||||
"yongchengshi": "永城市",
|
||||
"yongchuanqu": "永川区",
|
||||
"yongchunxian": "永春县",
|
||||
"yongdengxian": "永登县",
|
||||
"yongdexian": "永德县",
|
||||
"yongdingqu": "永定区",
|
||||
"yongfengxian": "永丰县",
|
||||
"yongfuxian": "永福县",
|
||||
"yonghexian": "永和县",
|
||||
"yongji": "永济市",
|
||||
"yongjiaxian": "永嘉县",
|
||||
"yongjingxian": "永靖县",
|
||||
"yongjishi": "永济市",
|
||||
"yongjixian": "永吉县",
|
||||
"yongkang": "永康市",
|
||||
"yongkangshi": "永康市",
|
||||
"yongnianqu": "永年区",
|
||||
"yongningqu": "邕宁区",
|
||||
"yongningxian": "永宁县",
|
||||
"yongpingxian": "永平县",
|
||||
"yongqiaoqu": "埇桥区",
|
||||
"yongqingxian": "永清县",
|
||||
"yongrenxian": "永仁县",
|
||||
"yongshanxian": "永善县",
|
||||
"yongshengxian": "永胜县",
|
||||
"yongshouxian": "永寿县",
|
||||
"yongshunxian": "永顺县",
|
||||
"yongtaixian": "永泰县",
|
||||
"yongxingxian": "永兴县",
|
||||
"yongxinxian": "永新县",
|
||||
"yongxiuxian": "永修县",
|
||||
"yongzhou": "永州",
|
||||
"yongzhoujingjijishukaifaqu": "永州经济技术开发区",
|
||||
"yongzhoushi": "永州",
|
||||
"yongzhoushihuilongweiguanliqu": "永州市回龙圩管理区",
|
||||
"youhaoqu": "友好区",
|
||||
"youjiangqu": "右江区",
|
||||
"youjianwangqu": "油尖旺区",
|
||||
"youxian": "攸县",
|
||||
"youxianqu": "游仙区",
|
||||
"youxixian": "尤溪县",
|
||||
"youyangtujiazumiaozuzizhixian": "酉阳土家族苗族自治县",
|
||||
"youyixian": "友谊县",
|
||||
"youyuxian": "右玉县",
|
||||
"yuananxian": "远安县",
|
||||
"yuanbaoqu": "元宝区",
|
||||
"yuanbaoshanqu": "元宝山区",
|
||||
"yuanchengqu": "源城区",
|
||||
"yuanhuiqu": "源汇区",
|
||||
"yuanjiang": "沅江市",
|
||||
"yuanjianghanizuyizudaizuzizhixian": "元江哈尼族彝族傣族自治县",
|
||||
"yuanjiangshi": "沅江市",
|
||||
"yuanlangqu": "元朗区",
|
||||
"yuanlingxian": "沅陵县",
|
||||
"yuanmouxian": "元谋县",
|
||||
"yuanping": "原平市",
|
||||
"yuanpingshi": "原平市",
|
||||
"yuanqu": "裕安区",
|
||||
"yuanquxian": "垣曲县",
|
||||
"yuanshixian": "元氏县",
|
||||
"yubeiqu": "渝北区",
|
||||
"yucheng": "禹城市",
|
||||
"yuchengqu": "雨城区",
|
||||
"yuchengshi": "禹城市",
|
||||
"yuchengxian": "虞城县",
|
||||
"yuciqu": "榆次区",
|
||||
"yudongzonghewuliuchanyejujiqu": "豫东综合物流产业聚集区",
|
||||
"yudouxian": "于都县",
|
||||
"yuechengqu": "越城区",
|
||||
"yuechixian": "岳池县",
|
||||
"yuehuqu": "月湖区",
|
||||
"yueluqu": "岳麓区",
|
||||
"yuepuhuxian": "岳普湖县",
|
||||
"yueqing": "乐清市",
|
||||
"yueqingshi": "乐清市",
|
||||
"yuetangqu": "岳塘区",
|
||||
"yuexiuqu": "越秀区",
|
||||
"yueyang": "岳阳",
|
||||
"yueyanglouqu": "岳阳楼区",
|
||||
"yueyangshi": "岳阳",
|
||||
"yueyangshiquyuanguanliqu": "岳阳市屈原管理区",
|
||||
"yueyangxian": "岳阳县",
|
||||
"yufengqu": "鱼峰区",
|
||||
"yuganxian": "余干县",
|
||||
"yuhangqu": "余杭区",
|
||||
"yuhongqu": "于洪区",
|
||||
"yuhuan": "玉环市",
|
||||
"yuhuanshi": "玉环市",
|
||||
"yuhuataiqu": "雨花台区",
|
||||
"yuhuiqu": "禹会区",
|
||||
"yuhuqu": "雨湖区",
|
||||
"yujiangqu": "余江区",
|
||||
"yulixian": "尉犁县",
|
||||
"yulongnaxizuzizhixian": "玉龙纳西族自治县",
|
||||
"yumen": "玉门市",
|
||||
"yumenshi": "玉门市",
|
||||
"yuminxian": "裕民县",
|
||||
"yunanqu": "云安区",
|
||||
"yunanxian": "郁南县",
|
||||
"yuncheng": "运城",
|
||||
"yunchengqu": "云城区",
|
||||
"yunchengshi": "运城",
|
||||
"yunchengxian": "郓城县",
|
||||
"yunfu": "云浮",
|
||||
"yunfushi": "云浮",
|
||||
"yungangqu": "云冈区",
|
||||
"yunhequ": "运河区",
|
||||
"yunhexian": "云和县",
|
||||
"yunlianxian": "筠连县",
|
||||
"yunlongqu": "云龙区",
|
||||
"yunlongshifanqu": "云龙示范区",
|
||||
"yunlongxian": "云龙县",
|
||||
"yunmengxian": "云梦县",
|
||||
"yunxian": "云县",
|
||||
"yunxiaoxian": "云霄县",
|
||||
"yunxiqu": "云溪区",
|
||||
"yunxixian": "郧西县",
|
||||
"yunyangqu": "郧阳区",
|
||||
"yunyangxian": "云阳县",
|
||||
"yunyanqu": "云岩区",
|
||||
"yunzhouqu": "云州区",
|
||||
"yupingdongzuzizhixian": "玉屏侗族自治县",
|
||||
"yuqingxian": "余庆县",
|
||||
"yuquanqu": "玉泉区",
|
||||
"yushanqu": "雨山区",
|
||||
"yushanxian": "玉山县",
|
||||
"yushexian": "榆社县",
|
||||
"yushuiqu": "渝水区",
|
||||
"yushuzangzu": "玉树藏族",
|
||||
"yushuzangzuzizhizhou": "玉树藏族",
|
||||
"yutaixian": "鱼台县",
|
||||
"yuwangtaiqu": "禹王台区",
|
||||
"yuxi": "玉溪",
|
||||
"yuxishi": "玉溪",
|
||||
"yuyangqu": "榆阳区",
|
||||
"yuyao": "余姚市",
|
||||
"yuyaoshi": "余姚市",
|
||||
"yuzhongqu": "渝中区",
|
||||
"yuzhongxian": "榆中县",
|
||||
"yuzhou": "禹州市",
|
||||
"yuzhouqu": "玉州区",
|
||||
"yuzhoushi": "禹州市",
|
||||
"zaduoxian": "杂多县",
|
||||
"zanhuangxian": "赞皇县",
|
||||
"zaoqiangxian": "枣强县",
|
||||
"zaoyang": "枣阳市",
|
||||
"zaoyangshi": "枣阳市",
|
||||
"zaozhuang": "枣庄",
|
||||
"zaozhuangshi": "枣庄",
|
||||
"zekuxian": "泽库县",
|
||||
"zengchengqu": "增城区",
|
||||
"zepuxian": "泽普县",
|
||||
"zezhouxian": "泽州县",
|
||||
"zhadaxian": "札达县",
|
||||
"zhalainuoerqu": "扎赉诺尔区",
|
||||
"zhalaiteqi": "扎赉特旗",
|
||||
"zhalantun": "扎兰屯市",
|
||||
"zhalantunshi": "扎兰屯市",
|
||||
"zhaluteqi": "扎鲁特旗",
|
||||
"zhanangxian": "扎囊县",
|
||||
"zhangbaichaoxianzuzizhixian": "长白朝鲜族自治县",
|
||||
"zhangbeixian": "张北县",
|
||||
"zhangdianqu": "张店区",
|
||||
"zhangfengxian": "长丰县",
|
||||
"zhangge": "长葛市",
|
||||
"zhanggeshi": "长葛市",
|
||||
"zhanggongqu": "章贡区",
|
||||
"zhanghaixian": "长海县",
|
||||
"zhangjiachuanhuizuzizhixian": "张家川回族自治县",
|
||||
"zhangjiagang": "张家港市",
|
||||
"zhangjiagangshi": "张家港市",
|
||||
"zhangjiajie": "张家界",
|
||||
"zhangjiajieshi": "张家界",
|
||||
"zhangjiakou": "张家口",
|
||||
"zhangjiakoujingjikaifaqu": "张家口经济开发区",
|
||||
"zhangjiakoushi": "张家口",
|
||||
"zhangjiakoushichabeiguanliqu": "张家口市察北管理区",
|
||||
"zhangjiakoushisaibeiguanliqu": "张家口市塞北管理区",
|
||||
"zhanglingxian": "长岭县",
|
||||
"zhangningqu": "长宁区",
|
||||
"zhangningxian": "长宁县",
|
||||
"zhangping": "漳平市",
|
||||
"zhangpingshi": "漳平市",
|
||||
"zhangpuxian": "漳浦县",
|
||||
"zhangqingqu": "长清区",
|
||||
"zhangqiuqu": "章丘区",
|
||||
"zhangshu": "樟树市",
|
||||
"zhangshunxian": "长顺县",
|
||||
"zhangshushi": "樟树市",
|
||||
"zhangtaiqu": "长泰区",
|
||||
"zhangtaixian": "长泰县",
|
||||
"zhangwanqu": "张湾区",
|
||||
"zhangxian": "漳县",
|
||||
"zhangyangtujiazuzizhixian": "长阳土家族自治县",
|
||||
"zhangye": "张掖",
|
||||
"zhangyeshi": "张掖",
|
||||
"zhangyuan": "长垣市",
|
||||
"zhangyuanshi": "长垣市",
|
||||
"zhangzhi": "长治",
|
||||
"zhangzhishi": "长治",
|
||||
"zhangzhou": "漳州",
|
||||
"zhangzhouqu": "长洲区",
|
||||
"zhangzhoushi": "漳州",
|
||||
"zhangzixian": "长子县",
|
||||
"zhanhequ": "湛河区",
|
||||
"zhanhuaqu": "沾化区",
|
||||
"zhanjiang": "湛江",
|
||||
"zhanjiangshi": "湛江",
|
||||
"zhanqianqu": "站前区",
|
||||
"zhanyiqu": "沾益区",
|
||||
"zhaoanxian": "诏安县",
|
||||
"zhaodong": "肇东市",
|
||||
"zhaodongshi": "肇东市",
|
||||
"zhaohuaqu": "昭化区",
|
||||
"zhaojuexian": "昭觉县",
|
||||
"zhaolingqu": "召陵区",
|
||||
"zhaopingxian": "昭平县",
|
||||
"zhaoqing": "肇庆",
|
||||
"zhaoqingshi": "肇庆",
|
||||
"zhaosuxian": "昭苏县",
|
||||
"zhaotong": "昭通",
|
||||
"zhaotongshi": "昭通",
|
||||
"zhaoxian": "赵县",
|
||||
"zhaoyang": "朝阳",
|
||||
"zhaoyangqu": "昭阳区",
|
||||
"zhaoyangshi": "朝阳",
|
||||
"zhaoyangxian": "朝阳县",
|
||||
"zhaoyuan": "招远市",
|
||||
"zhaoyuanshi": "招远市",
|
||||
"zhaoyuanxian": "肇源县",
|
||||
"zhaozhouxian": "肇州县",
|
||||
"zhashuixian": "柞水县",
|
||||
"zhechengxian": "柘城县",
|
||||
"zhenanqu": "振安区",
|
||||
"zhenanxian": "镇安县",
|
||||
"zhenbaxian": "镇巴县",
|
||||
"zhenfengxian": "贞丰县",
|
||||
"zhenganxian": "正安县",
|
||||
"zhengdingxian": "正定县",
|
||||
"zhenghexian": "政和县",
|
||||
"zhenglanqi": "正蓝旗",
|
||||
"zhengningxian": "正宁县",
|
||||
"zhengxiangbaiqi": "正镶白旗",
|
||||
"zhengxiangqu": "蒸湘区",
|
||||
"zhengyangxian": "正阳县",
|
||||
"zhengzhou": "郑州",
|
||||
"zhengzhougaoxinjishuchanyekaifaqu": "郑州高新技术产业开发区",
|
||||
"zhengzhouhangkonggangjingjizongheshiyanqu": "郑州航空港经济综合实验区",
|
||||
"zhengzhoujingjijishukaifaqu": "郑州经济技术开发区",
|
||||
"zhengzhoushi": "郑州",
|
||||
"zhenhaiqu": "镇海区",
|
||||
"zhenjiang": "镇江",
|
||||
"zhenjiangqu": "浈江区",
|
||||
"zhenjiangshi": "镇江",
|
||||
"zhenjiangxinqu": "镇江新区",
|
||||
"zhenkangxian": "镇康县",
|
||||
"zhenlaixian": "镇赉县",
|
||||
"zhenningbuyizumiaozuzizhixian": "镇宁布依族苗族自治县",
|
||||
"zhenxingqu": "振兴区",
|
||||
"zhenxiongxian": "镇雄县",
|
||||
"zhenyuanyizuhanizulahuzuzizhixian": "镇沅彝族哈尼族拉祜族自治县",
|
||||
"zherongxian": "柘荣县",
|
||||
"zhidanxian": "志丹县",
|
||||
"zhiduoxian": "治多县",
|
||||
"zhifuqu": "芝罘区",
|
||||
"zhijiang": "枝江市",
|
||||
"zhijiangdongzuzizhixian": "芷江侗族自治县",
|
||||
"zhijiangshi": "枝江市",
|
||||
"zhijinxian": "织金县",
|
||||
"zhongbaxian": "仲巴县",
|
||||
"zhongfangxian": "中方县",
|
||||
"zhongjiangxian": "中江县",
|
||||
"zhonglouqu": "钟楼区",
|
||||
"zhongmuxian": "中牟县",
|
||||
"zhongningxian": "中宁县",
|
||||
"zhongshan": "中山",
|
||||
"zhongshanshi": "中山",
|
||||
"zhongshanxian": "钟山县",
|
||||
"zhongshaqundaodedaojiaojiqihaiyu": "中沙群岛的岛礁及其海域",
|
||||
"zhongwei": "中卫",
|
||||
"zhongweishi": "中卫",
|
||||
"zhongxian": "忠县",
|
||||
"zhongxiang": "钟祥市",
|
||||
"zhongxiangshi": "钟祥市",
|
||||
"zhongxinsuchugaoxinjishuchanyekaifaqu": "中新苏滁高新技术产业开发区",
|
||||
"zhongxiqu": "中西区",
|
||||
"zhongyangxian": "中阳县",
|
||||
"zhongyuanqu": "中原区",
|
||||
"zhongzhanqu": "中站区",
|
||||
"zhoucunqu": "周村区",
|
||||
"zhoukou": "周口",
|
||||
"zhoukoushi": "周口",
|
||||
"zhouningxian": "周宁县",
|
||||
"zhouquxian": "舟曲县",
|
||||
"zhoushan": "舟山",
|
||||
"zhoushanshi": "舟山",
|
||||
"zhouzhixian": "周至县",
|
||||
"zhuanghe": "庄河市",
|
||||
"zhuangheshi": "庄河市",
|
||||
"zhuanglangxian": "庄浪县",
|
||||
"zhucheng": "诸城市",
|
||||
"zhuchengshi": "诸城市",
|
||||
"zhuhai": "珠海",
|
||||
"zhuhaishi": "珠海",
|
||||
"zhuhuiqu": "珠晖区",
|
||||
"zhuji": "诸暨市",
|
||||
"zhujishi": "诸暨市",
|
||||
"zhumadian": "驻马店",
|
||||
"zhumadianshi": "驻马店",
|
||||
"zhungeerqi": "准格尔旗",
|
||||
"zhuoluxian": "涿鹿县",
|
||||
"zhuonixian": "卓尼县",
|
||||
"zhuozhou": "涿州市",
|
||||
"zhuozhoushi": "涿州市",
|
||||
"zhuozixian": "卓资县",
|
||||
"zhushanqu": "珠山区",
|
||||
"zhushanxian": "竹山县",
|
||||
"zhuxixian": "竹溪县",
|
||||
"zhuzhou": "株洲",
|
||||
"zhuzhoushi": "株洲",
|
||||
"zibo": "淄博",
|
||||
"ziboshi": "淄博",
|
||||
"zichuanqu": "淄川区",
|
||||
"zigong": "自贡",
|
||||
"zigongshi": "自贡",
|
||||
"ziguixian": "秭归县",
|
||||
"zijinxian": "紫金县",
|
||||
"ziliujingqu": "自流井区",
|
||||
"zitongxian": "梓潼县",
|
||||
"zixing": "资兴市",
|
||||
"zixingshi": "资兴市",
|
||||
"zixixian": "资溪县",
|
||||
"ziyang": "资阳",
|
||||
"ziyangqu": "资阳区",
|
||||
"ziyangshi": "资阳",
|
||||
"ziyangxian": "紫阳县",
|
||||
"ziyuanxian": "资源县",
|
||||
"ziyunmiaozubuyizuzizhixian": "紫云苗族布依族自治县",
|
||||
"zizhang": "子长市",
|
||||
"zizhangshi": "子长市",
|
||||
"zizhongxian": "资中县",
|
||||
"zizhouxian": "子洲县",
|
||||
"zongyangxian": "枞阳县",
|
||||
"zoucheng": "邹城市",
|
||||
"zouchengshi": "邹城市",
|
||||
"zouping": "邹平市",
|
||||
"zoupingshi": "邹平市",
|
||||
"zunhua": "遵化市",
|
||||
"zunhuashi": "遵化市",
|
||||
"zunyi": "遵义",
|
||||
"zunyishi": "遵义",
|
||||
"zuogongxian": "左贡县",
|
||||
"zuoquanxian": "左权县",
|
||||
"zuoyunxian": "左云县"
|
||||
}
|
||||
}
|
||||
@@ -1404,33 +1404,60 @@ class ExportService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取群成员群昵称。优先使用 DLL,必要时回退到 `contact.chat_room.ext_buffer` 解析。
|
||||
* 获取群成员群昵称。后端结果为唯一业务真值,前端仅做冲突净化防串号。
|
||||
*/
|
||||
async getGroupNicknamesForRoom(chatroomId: string, candidates: string[] = []): Promise<Map<string, string>> {
|
||||
const nicknameMap = new Map<string, string>()
|
||||
|
||||
try {
|
||||
const dllResult = await wcdbService.getGroupNicknames(chatroomId)
|
||||
if (dllResult.success && dllResult.nicknames) {
|
||||
this.mergeGroupNicknameEntries(nicknameMap, Object.entries(dllResult.nicknames))
|
||||
if (!dllResult.success || !dllResult.nicknames) {
|
||||
return new Map<string, string>()
|
||||
}
|
||||
return this.buildTrustedGroupNicknameMap(Object.entries(dllResult.nicknames), candidates)
|
||||
} catch (e) {
|
||||
console.error('getGroupNicknamesForRoom dll error:', e)
|
||||
return new Map<string, string>()
|
||||
}
|
||||
}
|
||||
|
||||
private normalizeGroupNicknameIdentity(value: string): string {
|
||||
const raw = String(value || '').trim()
|
||||
if (!raw) return ''
|
||||
return raw.toLowerCase()
|
||||
}
|
||||
|
||||
private buildTrustedGroupNicknameMap(
|
||||
entries: Iterable<[string, string]>,
|
||||
candidates: string[] = []
|
||||
): Map<string, string> {
|
||||
const candidateSet = new Set(
|
||||
this.buildGroupNicknameIdCandidates(candidates)
|
||||
.map((id) => this.normalizeGroupNicknameIdentity(id))
|
||||
.filter(Boolean)
|
||||
)
|
||||
|
||||
const buckets = new Map<string, Set<string>>()
|
||||
for (const [memberIdRaw, nicknameRaw] of entries) {
|
||||
const identity = this.normalizeGroupNicknameIdentity(memberIdRaw || '')
|
||||
if (!identity) continue
|
||||
if (candidateSet.size > 0 && !candidateSet.has(identity)) continue
|
||||
|
||||
const nickname = this.normalizeGroupNickname(nicknameRaw || '')
|
||||
if (!nickname) continue
|
||||
|
||||
const slot = buckets.get(identity)
|
||||
if (slot) {
|
||||
slot.add(nickname)
|
||||
} else {
|
||||
buckets.set(identity, new Set([nickname]))
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await wcdbService.getChatRoomExtBuffer(chatroomId)
|
||||
if (!result.success || !result.extBuffer) {
|
||||
return nicknameMap
|
||||
}
|
||||
const extBuffer = this.decodeExtBuffer(result.extBuffer)
|
||||
if (!extBuffer) return nicknameMap
|
||||
this.mergeGroupNicknameEntries(nicknameMap, this.parseGroupNicknamesFromExtBuffer(extBuffer, candidates).entries())
|
||||
return nicknameMap
|
||||
} catch (e) {
|
||||
console.error('getGroupNicknamesForRoom error:', e)
|
||||
return nicknameMap
|
||||
const trusted = new Map<string, string>()
|
||||
for (const [identity, nicknameSet] of buckets.entries()) {
|
||||
if (nicknameSet.size !== 1) continue
|
||||
trusted.set(identity, Array.from(nicknameSet)[0])
|
||||
}
|
||||
return trusted
|
||||
}
|
||||
|
||||
private mergeGroupNicknameEntries(
|
||||
@@ -1680,8 +1707,6 @@ class ExportService {
|
||||
const raw = String(rawValue || '').trim()
|
||||
if (!raw) continue
|
||||
set.add(raw)
|
||||
const cleaned = this.cleanAccountDirName(raw)
|
||||
if (cleaned && cleaned !== raw) set.add(cleaned)
|
||||
}
|
||||
return Array.from(set)
|
||||
}
|
||||
@@ -1690,29 +1715,20 @@ class ExportService {
|
||||
const idCandidates = this.buildGroupNicknameIdCandidates(candidates)
|
||||
if (idCandidates.length === 0) return ''
|
||||
|
||||
let resolved = ''
|
||||
for (const id of idCandidates) {
|
||||
const exact = this.normalizeGroupNickname(groupNicknamesMap.get(id) || '')
|
||||
if (exact) return exact
|
||||
const lower = this.normalizeGroupNickname(groupNicknamesMap.get(id.toLowerCase()) || '')
|
||||
if (lower) return lower
|
||||
}
|
||||
|
||||
for (const id of idCandidates) {
|
||||
const lower = id.toLowerCase()
|
||||
let found = ''
|
||||
let matched = 0
|
||||
for (const [key, value] of groupNicknamesMap.entries()) {
|
||||
if (String(key || '').toLowerCase() !== lower) continue
|
||||
const normalized = this.normalizeGroupNickname(value || '')
|
||||
if (!normalized) continue
|
||||
found = normalized
|
||||
matched += 1
|
||||
if (matched > 1) return ''
|
||||
const normalizedId = this.normalizeGroupNicknameIdentity(id)
|
||||
if (!normalizedId) continue
|
||||
const candidateNickname = this.normalizeGroupNickname(groupNicknamesMap.get(normalizedId) || '')
|
||||
if (!candidateNickname) continue
|
||||
if (!resolved) {
|
||||
resolved = candidateNickname
|
||||
continue
|
||||
}
|
||||
if (matched === 1 && found) return found
|
||||
if (resolved !== candidateNickname) return ''
|
||||
}
|
||||
|
||||
return ''
|
||||
return resolved
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,6 +5,7 @@ import { ConfigService } from './config'
|
||||
import { wcdbService } from './wcdbService'
|
||||
import { chatService } from './chatService'
|
||||
import type { Message } from './chatService'
|
||||
import type { ChatStatistics } from './analyticsService'
|
||||
|
||||
export interface GroupChatInfo {
|
||||
username: string
|
||||
@@ -49,6 +50,13 @@ export interface GroupMediaStats {
|
||||
total: number
|
||||
}
|
||||
|
||||
export interface GroupMemberAnalytics {
|
||||
statistics: ChatStatistics
|
||||
timeDistribution: Record<number, number>
|
||||
commonPhrases?: Array<{ phrase: string; count: number }>
|
||||
commonEmojis?: Array<{ emoji: string; count: number }>
|
||||
}
|
||||
|
||||
export interface GroupMemberMessagesPage {
|
||||
messages: Message[]
|
||||
hasMore: boolean
|
||||
@@ -257,34 +265,60 @@ class GroupAnalyticsService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 从 DLL 获取群成员的群昵称
|
||||
* 从后端获取群成员群昵称,并在前端进行唯一性净化防串号。
|
||||
*/
|
||||
private async getGroupNicknamesForRoom(chatroomId: string, candidates: string[] = []): Promise<Map<string, string>> {
|
||||
const nicknameMap = new Map<string, string>()
|
||||
|
||||
try {
|
||||
const dllResult = await wcdbService.getGroupNicknames(chatroomId)
|
||||
if (dllResult.success && dllResult.nicknames) {
|
||||
this.mergeGroupNicknameEntries(nicknameMap, Object.entries(dllResult.nicknames))
|
||||
if (!dllResult.success || !dllResult.nicknames) {
|
||||
return new Map<string, string>()
|
||||
}
|
||||
return this.buildTrustedGroupNicknameMap(Object.entries(dllResult.nicknames), candidates)
|
||||
} catch (e) {
|
||||
console.error('getGroupNicknamesForRoom dll error:', e)
|
||||
return new Map<string, string>()
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await wcdbService.getChatRoomExtBuffer(chatroomId)
|
||||
if (!result.success || !result.extBuffer) {
|
||||
return nicknameMap
|
||||
private normalizeGroupNicknameIdentity(value: string): string {
|
||||
const raw = String(value || '').trim()
|
||||
if (!raw) return ''
|
||||
return raw.toLowerCase()
|
||||
}
|
||||
|
||||
private buildTrustedGroupNicknameMap(
|
||||
entries: Iterable<[string, string]>,
|
||||
candidates: string[] = []
|
||||
): Map<string, string> {
|
||||
const candidateSet = new Set(
|
||||
this.buildGroupNicknameIdCandidates(candidates)
|
||||
.map((id) => this.normalizeGroupNicknameIdentity(id))
|
||||
.filter(Boolean)
|
||||
)
|
||||
|
||||
const buckets = new Map<string, Set<string>>()
|
||||
for (const [memberIdRaw, nicknameRaw] of entries) {
|
||||
const identity = this.normalizeGroupNicknameIdentity(memberIdRaw || '')
|
||||
if (!identity) continue
|
||||
if (candidateSet.size > 0 && !candidateSet.has(identity)) continue
|
||||
|
||||
const nickname = this.normalizeGroupNickname(nicknameRaw || '')
|
||||
if (!nickname) continue
|
||||
|
||||
const slot = buckets.get(identity)
|
||||
if (slot) {
|
||||
slot.add(nickname)
|
||||
} else {
|
||||
buckets.set(identity, new Set([nickname]))
|
||||
}
|
||||
|
||||
const extBuffer = this.decodeExtBuffer(result.extBuffer)
|
||||
if (!extBuffer) return nicknameMap
|
||||
this.mergeGroupNicknameEntries(nicknameMap, this.parseGroupNicknamesFromExtBuffer(extBuffer, candidates).entries())
|
||||
return nicknameMap
|
||||
} catch (e) {
|
||||
console.error('getGroupNicknamesForRoom error:', e)
|
||||
return nicknameMap
|
||||
}
|
||||
|
||||
const trusted = new Map<string, string>()
|
||||
for (const [identity, nicknameSet] of buckets.entries()) {
|
||||
if (nicknameSet.size !== 1) continue
|
||||
trusted.set(identity, Array.from(nicknameSet)[0])
|
||||
}
|
||||
return trusted
|
||||
}
|
||||
|
||||
private mergeGroupNicknameEntries(
|
||||
@@ -475,6 +509,16 @@ class GroupAnalyticsService {
|
||||
return Array.from(set)
|
||||
}
|
||||
|
||||
private buildGroupNicknameIdCandidates(values: Array<string | undefined | null>): string[] {
|
||||
const set = new Set<string>()
|
||||
for (const rawValue of values) {
|
||||
const raw = String(rawValue || '').trim()
|
||||
if (!raw) continue
|
||||
set.add(raw)
|
||||
}
|
||||
return Array.from(set)
|
||||
}
|
||||
|
||||
private toNonNegativeInteger(value: unknown): number {
|
||||
const parsed = Number(value)
|
||||
if (!Number.isFinite(parsed)) return 0
|
||||
@@ -663,30 +707,23 @@ class GroupAnalyticsService {
|
||||
}
|
||||
|
||||
private resolveGroupNicknameByCandidates(groupNicknames: Map<string, string>, candidates: string[]): string {
|
||||
const idCandidates = this.buildIdCandidates(candidates)
|
||||
const idCandidates = this.buildGroupNicknameIdCandidates(candidates)
|
||||
if (idCandidates.length === 0) return ''
|
||||
|
||||
let resolved = ''
|
||||
for (const id of idCandidates) {
|
||||
const exact = this.normalizeGroupNickname(groupNicknames.get(id) || '')
|
||||
if (exact) return exact
|
||||
}
|
||||
|
||||
for (const id of idCandidates) {
|
||||
const lower = id.toLowerCase()
|
||||
let found = ''
|
||||
let matched = 0
|
||||
for (const [key, value] of groupNicknames.entries()) {
|
||||
if (String(key || '').toLowerCase() !== lower) continue
|
||||
const normalized = this.normalizeGroupNickname(value || '')
|
||||
if (!normalized) continue
|
||||
found = normalized
|
||||
matched += 1
|
||||
if (matched > 1) return ''
|
||||
const normalizedId = this.normalizeGroupNicknameIdentity(id)
|
||||
if (!normalizedId) continue
|
||||
const candidateNickname = this.normalizeGroupNickname(groupNicknames.get(normalizedId) || '')
|
||||
if (!candidateNickname) continue
|
||||
if (!resolved) {
|
||||
resolved = candidateNickname
|
||||
continue
|
||||
}
|
||||
if (matched === 1 && found) return found
|
||||
if (resolved !== candidateNickname) return ''
|
||||
}
|
||||
|
||||
return ''
|
||||
return resolved
|
||||
}
|
||||
|
||||
private sanitizeWorksheetName(name: string): string {
|
||||
@@ -768,7 +805,12 @@ class GroupAnalyticsService {
|
||||
return normalized > 10000000000 ? Math.floor(normalized / 1000) : normalized
|
||||
}
|
||||
|
||||
private extractRowSenderUsername(row: Record<string, any>): string {
|
||||
private extractRowSenderUsername(row: Record<string, any>, myWxid?: string): string {
|
||||
const isSendRaw = row.computed_is_send ?? row.is_send ?? row.isSend ?? row.WCDB_CT_is_send
|
||||
if (isSendRaw != null && parseInt(isSendRaw, 10) === 1 && myWxid) {
|
||||
return myWxid
|
||||
}
|
||||
|
||||
const candidates = [
|
||||
row.sender_username,
|
||||
row.senderUsername,
|
||||
@@ -791,13 +833,33 @@ class GroupAnalyticsService {
|
||||
if (normalizedValue) return normalizedValue
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: fast extract from raw content to avoid full parse
|
||||
const rawContent = String(row.StrContent || row.message_content || row.content || row.msg_content || '').trim()
|
||||
if (rawContent) {
|
||||
const match = /^\s*([a-zA-Z0-9_@-]{4,}):(?!\/\/)\s*(?:\r?\n|<br\s*\/?>)/i.exec(rawContent)
|
||||
if (match && match[1]) {
|
||||
return match[1].trim()
|
||||
}
|
||||
}
|
||||
|
||||
return ''
|
||||
}
|
||||
|
||||
private parseSingleMessageRow(row: Record<string, any>): Message | null {
|
||||
try {
|
||||
const mapped = chatService.mapRowsToMessagesForApi([row])
|
||||
return Array.isArray(mapped) && mapped.length > 0 ? mapped[0] : null
|
||||
if (Array.isArray(mapped) && mapped.length > 0) {
|
||||
const msg = mapped[0]
|
||||
if (!msg.localType) {
|
||||
msg.localType = parseInt(row.Type || row.type || row.local_type || row.msg_type || '0', 10)
|
||||
}
|
||||
if (!msg.createTime) {
|
||||
msg.createTime = parseInt(row.CreateTime || row.create_time || row.createTime || row.msg_time || '0', 10)
|
||||
}
|
||||
return msg
|
||||
}
|
||||
return null
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
@@ -852,7 +914,7 @@ class GroupAnalyticsService {
|
||||
if (rows.length === 0) break
|
||||
|
||||
for (const row of rows) {
|
||||
const senderFromRow = this.extractRowSenderUsername(row)
|
||||
const senderFromRow = this.extractRowSenderUsername(row, String(this.configService.get('myWxid') || '').trim())
|
||||
if (senderFromRow && !matchesTargetSender(senderFromRow)) {
|
||||
continue
|
||||
}
|
||||
@@ -958,7 +1020,7 @@ class GroupAnalyticsService {
|
||||
const row = rows[index]
|
||||
consumedRows += 1
|
||||
|
||||
const senderFromRow = this.extractRowSenderUsername(row)
|
||||
const senderFromRow = this.extractRowSenderUsername(row, String(this.configService.get('myWxid') || '').trim())
|
||||
if (senderFromRow && !matchesTargetSender(senderFromRow)) {
|
||||
continue
|
||||
}
|
||||
@@ -1438,6 +1500,154 @@ class GroupAnalyticsService {
|
||||
}
|
||||
}
|
||||
|
||||
async getGroupMemberAnalytics(
|
||||
chatroomId: string,
|
||||
memberUsername: string,
|
||||
startTime?: number,
|
||||
endTime?: number
|
||||
): Promise<{ success: boolean; data?: GroupMemberAnalytics; error?: string }> {
|
||||
try {
|
||||
const conn = await this.ensureConnected()
|
||||
if (!conn.success) return { success: false, error: conn.error }
|
||||
|
||||
const normalizedChatroomId = String(chatroomId || '').trim()
|
||||
const normalizedMemberUsername = String(memberUsername || '').trim()
|
||||
|
||||
const batchSize = 10000
|
||||
const senderMatchCache = new Map<string, boolean>()
|
||||
const matchesTargetSender = (sender: string | null | undefined): boolean => {
|
||||
const key = String(sender || '').trim().toLowerCase()
|
||||
if (!key) return false
|
||||
const cached = senderMatchCache.get(key)
|
||||
if (typeof cached === 'boolean') return cached
|
||||
const matched = this.isSameAccountIdentity(normalizedMemberUsername, sender)
|
||||
senderMatchCache.set(key, matched)
|
||||
return matched
|
||||
}
|
||||
|
||||
const cursorResult = await this.openMemberMessageCursor(normalizedChatroomId, batchSize, true, startTime || 0, endTime || 0)
|
||||
if (!cursorResult.success || !cursorResult.cursor) {
|
||||
return { success: false, error: cursorResult.error || '创建游标失败' }
|
||||
}
|
||||
|
||||
const cursor = cursorResult.cursor
|
||||
const stats: ChatStatistics = {
|
||||
totalMessages: 0,
|
||||
textMessages: 0,
|
||||
imageMessages: 0,
|
||||
voiceMessages: 0,
|
||||
videoMessages: 0,
|
||||
emojiMessages: 0,
|
||||
otherMessages: 0,
|
||||
sentMessages: 0, // In group, we only fetch messages of this member, so sentMessages = totalMessages
|
||||
receivedMessages: 0, // No meaning here
|
||||
firstMessageTime: null,
|
||||
lastMessageTime: null,
|
||||
activeDays: 0,
|
||||
messageTypeCounts: {}
|
||||
}
|
||||
|
||||
const hourlyDistribution: Record<number, number> = {}
|
||||
for (let i = 0; i < 24; i++) hourlyDistribution[i] = 0
|
||||
const dailySet = new Set<string>()
|
||||
const textTypes = [1, 244813135921]
|
||||
|
||||
const phraseCounts = new Map<string, number>()
|
||||
const emojiCounts = new Map<string, number>()
|
||||
|
||||
const myWxid = String(this.configService.get('myWxid') || '').trim()
|
||||
|
||||
try {
|
||||
while (true) {
|
||||
const batch = await wcdbService.fetchMessageBatch(cursor)
|
||||
if (!batch.success) {
|
||||
return { success: false, error: batch.error || '获取分析数据失败' }
|
||||
}
|
||||
const rows = Array.isArray(batch.rows) ? batch.rows as Record<string, any>[] : []
|
||||
if (rows.length === 0) break
|
||||
|
||||
for (const row of rows) {
|
||||
let senderFromRow = this.extractRowSenderUsername(row, myWxid)
|
||||
|
||||
const isSendRaw = row.computed_is_send ?? row.is_send ?? row.isSend ?? row.WCDB_CT_is_send
|
||||
const isSend = isSendRaw != null ? parseInt(isSendRaw, 10) === 1 : false
|
||||
|
||||
if (isSend) {
|
||||
senderFromRow = myWxid
|
||||
}
|
||||
|
||||
if (!senderFromRow || !matchesTargetSender(senderFromRow)) {
|
||||
continue
|
||||
}
|
||||
|
||||
const msgType = parseInt(row.Type || row.type || row.local_type || row.msg_type || '0', 10)
|
||||
const createTime = parseInt(row.CreateTime || row.create_time || row.createTime || row.msg_time || '0', 10)
|
||||
|
||||
let content = String(row.StrContent || row.message_content || row.content || row.msg_content || '')
|
||||
if (content) {
|
||||
content = content.replace(/^\s*([a-zA-Z0-9_@-]{4,}):(?!\/\/)\s*(?:\r?\n|<br\s*\/?>)/i, '')
|
||||
}
|
||||
|
||||
stats.totalMessages++
|
||||
if (textTypes.includes(msgType)) {
|
||||
stats.textMessages++
|
||||
if (content) {
|
||||
const text = content.trim()
|
||||
if (text && text.length <= 20) {
|
||||
phraseCounts.set(text, (phraseCounts.get(text) || 0) + 1)
|
||||
}
|
||||
const emojiMatches = text.match(/\[.*?\]/g)
|
||||
if (emojiMatches) {
|
||||
for (const em of emojiMatches) {
|
||||
emojiCounts.set(em, (emojiCounts.get(em) || 0) + 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (msgType === 3) stats.imageMessages++
|
||||
else if (msgType === 34) stats.voiceMessages++
|
||||
else if (msgType === 43) stats.videoMessages++
|
||||
else if (msgType === 47) stats.emojiMessages++
|
||||
else stats.otherMessages++
|
||||
|
||||
stats.sentMessages++
|
||||
|
||||
stats.messageTypeCounts[msgType] = (stats.messageTypeCounts[msgType] || 0) + 1
|
||||
|
||||
if (createTime > 0) {
|
||||
if (stats.firstMessageTime === null || createTime < stats.firstMessageTime) stats.firstMessageTime = createTime
|
||||
if (stats.lastMessageTime === null || createTime > stats.lastMessageTime) stats.lastMessageTime = createTime
|
||||
|
||||
const d = new Date(createTime * 1000)
|
||||
const hour = d.getHours()
|
||||
hourlyDistribution[hour]++
|
||||
dailySet.add(`${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`)
|
||||
}
|
||||
}
|
||||
if (!batch.hasMore) break
|
||||
}
|
||||
} finally {
|
||||
await wcdbService.closeMessageCursor(cursor)
|
||||
}
|
||||
|
||||
stats.activeDays = dailySet.size
|
||||
|
||||
const commonPhrases = Array.from(phraseCounts.entries())
|
||||
.sort((a, b) => b[1] - a[1])
|
||||
.slice(0, 10)
|
||||
.map(([phrase, count]) => ({ phrase, count }))
|
||||
|
||||
const commonEmojis = Array.from(emojiCounts.entries())
|
||||
.sort((a, b) => b[1] - a[1])
|
||||
.slice(0, 10)
|
||||
.map(([emoji, count]) => ({ emoji, count }))
|
||||
|
||||
return { success: true, data: { statistics: stats, timeDistribution: hourlyDistribution, commonPhrases, commonEmojis } }
|
||||
} catch (e) {
|
||||
return { success: false, error: String(e) }
|
||||
}
|
||||
}
|
||||
|
||||
async exportGroupMemberMessages(
|
||||
chatroomId: string,
|
||||
memberUsername: string,
|
||||
|
||||
@@ -101,6 +101,7 @@ class HttpService {
|
||||
private server: http.Server | null = null
|
||||
private configService: ConfigService
|
||||
private port: number = 5031
|
||||
private host: string = '127.0.0.1'
|
||||
private running: boolean = false
|
||||
private connections: Set<import('net').Socket> = new Set()
|
||||
private messagePushClients: Set<http.ServerResponse> = new Set()
|
||||
@@ -114,12 +115,13 @@ class HttpService {
|
||||
/**
|
||||
* 启动 HTTP 服务
|
||||
*/
|
||||
async start(port: number = 5031): Promise<{ success: boolean; port?: number; error?: string }> {
|
||||
async start(port: number = 5031, host: string = '127.0.0.1'): Promise<{ success: boolean; port?: number; error?: string }> {
|
||||
if (this.running && this.server) {
|
||||
return { success: true, port: this.port }
|
||||
}
|
||||
|
||||
this.port = port
|
||||
this.host = host
|
||||
|
||||
return new Promise((resolve) => {
|
||||
this.server = http.createServer((req, res) => this.handleRequest(req, res))
|
||||
@@ -153,10 +155,10 @@ class HttpService {
|
||||
}
|
||||
})
|
||||
|
||||
this.server.listen(this.port, '127.0.0.1', () => {
|
||||
this.server.listen(this.port, this.host, () => {
|
||||
this.running = true
|
||||
this.startMessagePushHeartbeat()
|
||||
console.log(`[HttpService] HTTP API server started on http://127.0.0.1:${this.port}`)
|
||||
console.log(`[HttpService] HTTP API server started on http://${this.host}:${this.port}`)
|
||||
resolve({ success: true, port: this.port })
|
||||
})
|
||||
})
|
||||
@@ -225,7 +227,7 @@ class HttpService {
|
||||
}
|
||||
|
||||
getMessagePushStreamUrl(): string {
|
||||
return `http://127.0.0.1:${this.port}/api/v1/push/messages`
|
||||
return `http://${this.host}:${this.port}/api/v1/push/messages`
|
||||
}
|
||||
|
||||
broadcastMessagePush(payload: Record<string, unknown>): void {
|
||||
@@ -246,49 +248,116 @@ class HttpService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理 HTTP 请求
|
||||
*/
|
||||
private async handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
|
||||
// 设置 CORS 头
|
||||
res.setHeader('Access-Control-Allow-Origin', '*')
|
||||
res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS')
|
||||
res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
|
||||
|
||||
if (req.method === 'OPTIONS') {
|
||||
res.writeHead(204)
|
||||
res.end()
|
||||
return
|
||||
}
|
||||
|
||||
const url = new URL(req.url || '/', `http://127.0.0.1:${this.port}`)
|
||||
const pathname = url.pathname
|
||||
|
||||
try {
|
||||
// 路由处理
|
||||
if (pathname === '/health' || pathname === '/api/v1/health') {
|
||||
this.sendJson(res, { status: 'ok' })
|
||||
} else if (pathname === '/api/v1/push/messages') {
|
||||
this.handleMessagePushStream(req, res)
|
||||
} else if (pathname === '/api/v1/messages') {
|
||||
await this.handleMessages(url, res)
|
||||
} else if (pathname === '/api/v1/sessions') {
|
||||
await this.handleSessions(url, res)
|
||||
} else if (pathname === '/api/v1/contacts') {
|
||||
await this.handleContacts(url, res)
|
||||
} else if (pathname === '/api/v1/group-members') {
|
||||
await this.handleGroupMembers(url, res)
|
||||
} else if (pathname.startsWith('/api/v1/media/')) {
|
||||
this.handleMediaRequest(pathname, res)
|
||||
} else {
|
||||
this.sendError(res, 404, 'Not Found')
|
||||
async autoStart(): Promise<void> {
|
||||
const enabled = this.configService.get('httpApiEnabled')
|
||||
if (enabled) {
|
||||
const port = Number(this.configService.get('httpApiPort')) || 5031
|
||||
const host = String(this.configService.get('httpApiHost') || '127.0.0.1').trim() || '127.0.0.1'
|
||||
try {
|
||||
await this.start(port, host)
|
||||
console.log(`[HttpService] Auto-started on port ${port}`)
|
||||
} catch (err) {
|
||||
console.error('[HttpService] Auto-start failed:', err)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[HttpService] Request error:', error)
|
||||
this.sendError(res, 500, String(error))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析 POST 请求的 JSON Body
|
||||
*/
|
||||
private async parseBody(req: http.IncomingMessage): Promise<Record<string, any>> {
|
||||
if (req.method !== 'POST') return {}
|
||||
return new Promise((resolve) => {
|
||||
let body = ''
|
||||
req.on('data', chunk => { body += chunk.toString() })
|
||||
req.on('end', () => {
|
||||
try {
|
||||
resolve(JSON.parse(body))
|
||||
} catch {
|
||||
resolve({})
|
||||
}
|
||||
})
|
||||
req.on('error', () => resolve({}))
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 鉴权拦截器
|
||||
*/
|
||||
private verifyToken(req: http.IncomingMessage, url: URL, body: Record<string, any>): boolean {
|
||||
const expectedToken = String(this.configService.get('httpApiToken') || '').trim()
|
||||
if (!expectedToken) return true
|
||||
|
||||
const authHeader = req.headers.authorization
|
||||
if (authHeader && authHeader.toLowerCase().startsWith('bearer ')) {
|
||||
const token = authHeader.substring(7).trim()
|
||||
if (token === expectedToken) return true
|
||||
}
|
||||
|
||||
const queryToken = url.searchParams.get('access_token')
|
||||
if (queryToken && queryToken.trim() === expectedToken) return true
|
||||
|
||||
const bodyToken = body['access_token']
|
||||
return !!(bodyToken && String(bodyToken).trim() === expectedToken);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理 HTTP 请求 (重构后)
|
||||
*/
|
||||
private async handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
|
||||
res.setHeader('Access-Control-Allow-Origin', '*')
|
||||
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
|
||||
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization')
|
||||
|
||||
if (req.method === 'OPTIONS') {
|
||||
res.writeHead(204)
|
||||
res.end()
|
||||
return
|
||||
}
|
||||
|
||||
const url = new URL(req.url || '/', `http://${this.host}:${this.port}`)
|
||||
const pathname = url.pathname
|
||||
|
||||
try {
|
||||
const bodyParams = await this.parseBody(req)
|
||||
|
||||
for (const [key, value] of Object.entries(bodyParams)) {
|
||||
if (!url.searchParams.has(key)) {
|
||||
url.searchParams.set(key, String(value))
|
||||
}
|
||||
}
|
||||
|
||||
if (pathname !== '/health' && pathname !== '/api/v1/health') {
|
||||
if (!this.verifyToken(req, url, bodyParams)) {
|
||||
this.sendError(res, 401, 'Unauthorized: Invalid or missing access_token')
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if (pathname === '/health' || pathname === '/api/v1/health') {
|
||||
this.sendJson(res, { status: 'ok' })
|
||||
} else if (pathname === '/api/v1/push/messages') {
|
||||
this.handleMessagePushStream(req, res)
|
||||
} else if (pathname === '/api/v1/messages') {
|
||||
await this.handleMessages(url, res)
|
||||
} else if (pathname === '/api/v1/sessions') {
|
||||
await this.handleSessions(url, res)
|
||||
} else if (pathname === '/api/v1/contacts') {
|
||||
await this.handleContacts(url, res)
|
||||
} else if (pathname === '/api/v1/group-members') {
|
||||
await this.handleGroupMembers(url, res)
|
||||
} else if (pathname.startsWith('/api/v1/media/')) {
|
||||
this.handleMediaRequest(pathname, res)
|
||||
} else {
|
||||
this.sendError(res, 404, 'Not Found')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[HttpService] Request error:', error)
|
||||
this.sendError(res, 500, String(error))
|
||||
}
|
||||
}
|
||||
private startMessagePushHeartbeat(): void {
|
||||
if (this.messagePushHeartbeatTimer) return
|
||||
this.messagePushHeartbeatTimer = setInterval(() => {
|
||||
@@ -895,7 +964,7 @@ class HttpService {
|
||||
parsedContent: msg.parsedContent,
|
||||
mediaType: media?.kind,
|
||||
mediaFileName: media?.fileName,
|
||||
mediaUrl: media ? `http://127.0.0.1:${this.port}/api/v1/media/${media.relativePath}` : undefined,
|
||||
mediaUrl: media ? `http://${this.host}:${this.port}/api/v1/media/${media.relativePath}` : undefined,
|
||||
mediaLocalPath: media?.fullPath
|
||||
}
|
||||
}
|
||||
@@ -1017,13 +1086,31 @@ class HttpService {
|
||||
}
|
||||
|
||||
private lookupGroupNickname(groupNicknamesMap: Map<string, string>, sender: string): string {
|
||||
if (!sender) return ''
|
||||
const cleaned = this.normalizeAccountId(sender)
|
||||
return groupNicknamesMap.get(sender)
|
||||
|| groupNicknamesMap.get(sender.toLowerCase())
|
||||
|| groupNicknamesMap.get(cleaned)
|
||||
|| groupNicknamesMap.get(cleaned.toLowerCase())
|
||||
|| ''
|
||||
const key = String(sender || '').trim().toLowerCase()
|
||||
if (!key) return ''
|
||||
return groupNicknamesMap.get(key) || ''
|
||||
}
|
||||
|
||||
private buildTrustedGroupNicknameMap(nicknames: Record<string, string>): Map<string, string> {
|
||||
const buckets = new Map<string, Set<string>>()
|
||||
for (const [memberIdRaw, nicknameRaw] of Object.entries(nicknames || {})) {
|
||||
const memberId = String(memberIdRaw || '').trim().toLowerCase()
|
||||
const nickname = String(nicknameRaw || '').trim()
|
||||
if (!memberId || !nickname) continue
|
||||
const slot = buckets.get(memberId)
|
||||
if (slot) {
|
||||
slot.add(nickname)
|
||||
} else {
|
||||
buckets.set(memberId, new Set([nickname]))
|
||||
}
|
||||
}
|
||||
|
||||
const trusted = new Map<string, string>()
|
||||
for (const [memberId, nicknameSet] of buckets.entries()) {
|
||||
if (nicknameSet.size !== 1) continue
|
||||
trusted.set(memberId, Array.from(nicknameSet)[0])
|
||||
}
|
||||
return trusted
|
||||
}
|
||||
|
||||
private resolveChatLabSenderInfo(
|
||||
@@ -1094,21 +1181,7 @@ class HttpService {
|
||||
try {
|
||||
const result = await wcdbService.getGroupNicknames(talkerId)
|
||||
if (result.success && result.nicknames) {
|
||||
groupNicknamesMap = new Map()
|
||||
for (const [memberIdRaw, nicknameRaw] of Object.entries(result.nicknames)) {
|
||||
const memberId = String(memberIdRaw || '').trim()
|
||||
const nickname = String(nicknameRaw || '').trim()
|
||||
if (!memberId || !nickname) continue
|
||||
|
||||
groupNicknamesMap.set(memberId, nickname)
|
||||
groupNicknamesMap.set(memberId.toLowerCase(), nickname)
|
||||
|
||||
const cleaned = this.normalizeAccountId(memberId)
|
||||
if (cleaned) {
|
||||
groupNicknamesMap.set(cleaned, nickname)
|
||||
groupNicknamesMap.set(cleaned.toLowerCase(), nickname)
|
||||
}
|
||||
}
|
||||
groupNicknamesMap = this.buildTrustedGroupNicknameMap(result.nicknames)
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('[HttpService] Failed to get group nicknames:', e)
|
||||
@@ -1161,7 +1234,7 @@ class HttpService {
|
||||
type: this.mapMessageType(msg.localType, msg),
|
||||
content: this.getMessageContent(msg),
|
||||
platformMessageId: msg.serverId ? String(msg.serverId) : undefined,
|
||||
mediaPath: mediaMap.get(msg.localId) ? `http://127.0.0.1:${this.port}/api/v1/media/${mediaMap.get(msg.localId)!.relativePath}` : undefined
|
||||
mediaPath: mediaMap.get(msg.localId) ? `http://${this.host}:${this.port}/api/v1/media/${mediaMap.get(msg.localId)!.relativePath}` : undefined
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1389,4 +1462,3 @@ class HttpService {
|
||||
}
|
||||
|
||||
export const httpService = new HttpService()
|
||||
|
||||
@@ -304,11 +304,8 @@ class MessagePushService {
|
||||
}
|
||||
|
||||
const groupNicknames = await this.getGroupNicknames(chatroomId)
|
||||
const normalizedSender = this.normalizeAccountId(senderUsername)
|
||||
const nickname = groupNicknames[senderUsername]
|
||||
|| groupNicknames[senderUsername.toLowerCase()]
|
||||
|| groupNicknames[normalizedSender]
|
||||
|| groupNicknames[normalizedSender.toLowerCase()]
|
||||
const senderKey = senderUsername.toLowerCase()
|
||||
const nickname = groupNicknames[senderKey]
|
||||
|
||||
if (nickname) {
|
||||
return nickname
|
||||
@@ -328,22 +325,33 @@ class MessagePushService {
|
||||
}
|
||||
|
||||
const result = await wcdbService.getGroupNicknames(cacheKey)
|
||||
const nicknames = result.success && result.nicknames ? result.nicknames : {}
|
||||
const nicknames = result.success && result.nicknames
|
||||
? this.sanitizeGroupNicknames(result.nicknames)
|
||||
: {}
|
||||
this.groupNicknameCache.set(cacheKey, { nicknames, updatedAt: Date.now() })
|
||||
return nicknames
|
||||
}
|
||||
|
||||
private normalizeAccountId(value: string): string {
|
||||
const trimmed = String(value || '').trim()
|
||||
if (!trimmed) return trimmed
|
||||
|
||||
if (trimmed.toLowerCase().startsWith('wxid_')) {
|
||||
const match = trimmed.match(/^(wxid_[^_]+)/i)
|
||||
return match ? match[1] : trimmed
|
||||
private sanitizeGroupNicknames(nicknames: Record<string, string>): Record<string, string> {
|
||||
const buckets = new Map<string, Set<string>>()
|
||||
for (const [memberIdRaw, nicknameRaw] of Object.entries(nicknames || {})) {
|
||||
const memberId = String(memberIdRaw || '').trim().toLowerCase()
|
||||
const nickname = String(nicknameRaw || '').trim()
|
||||
if (!memberId || !nickname) continue
|
||||
const slot = buckets.get(memberId)
|
||||
if (slot) {
|
||||
slot.add(nickname)
|
||||
} else {
|
||||
buckets.set(memberId, new Set([nickname]))
|
||||
}
|
||||
}
|
||||
|
||||
const suffixMatch = trimmed.match(/^(.+)_([a-zA-Z0-9]{4})$/)
|
||||
return suffixMatch ? suffixMatch[1] : trimmed
|
||||
const trusted: Record<string, string> = {}
|
||||
for (const [memberId, nicknameSet] of buckets.entries()) {
|
||||
if (nicknameSet.size !== 1) continue
|
||||
trusted[memberId] = Array.from(nicknameSet)[0]
|
||||
}
|
||||
return trusted
|
||||
}
|
||||
|
||||
private isRecentMessage(messageKey: string): boolean {
|
||||
|
||||
@@ -75,6 +75,14 @@ export class VoiceTranscribeService {
|
||||
if (candidates.length === 0) {
|
||||
console.warn(`[VoiceTranscribe] 未找到 ${platformPkg} 目录,可能导致语音引擎加载失败`)
|
||||
}
|
||||
} else if (process.platform === 'win32') {
|
||||
// Windows: 把 sherpa-onnx DLL 所在目录加到 PATH,否则 native module 找不到依赖
|
||||
const existing = env['PATH'] || ''
|
||||
const merged = [...candidates, ...existing.split(';').filter(Boolean)]
|
||||
env['PATH'] = Array.from(new Set(merged)).join(';')
|
||||
if (candidates.length === 0) {
|
||||
console.warn(`[VoiceTranscribe] 未找到 ${platformPkg} 目录,可能导致语音引擎加载失败`)
|
||||
}
|
||||
}
|
||||
|
||||
return env
|
||||
|
||||
+7
-2
@@ -97,12 +97,17 @@
|
||||
"icon": "public/icon.png",
|
||||
"target": [
|
||||
"appimage",
|
||||
"deb",
|
||||
"tar.gz"
|
||||
],
|
||||
"category": "Utility",
|
||||
"executableName": "weflow",
|
||||
"synopsis": "WeFlow for Linux"
|
||||
"synopsis": "WeFlow for Linux",
|
||||
"extraFiles": [
|
||||
{
|
||||
"from": "resources/linux/install.sh",
|
||||
"to": "install.sh"
|
||||
}
|
||||
]
|
||||
},
|
||||
"nsis": {
|
||||
"oneClick": false,
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
APP_NAME="weflow"
|
||||
APP_EXEC="weflow"
|
||||
OPT_DIR="/opt/$APP_NAME"
|
||||
BIN_LINK="/usr/bin/$APP_NAME"
|
||||
DESKTOP_DIR="/usr/share/applications"
|
||||
ICON_DIR="/usr/share/pixmaps"
|
||||
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "❌ 请使用 root 权限运行此脚本 (例如: sudo ./install.sh)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🚀 开始安装 $APP_NAME..."
|
||||
|
||||
echo "📦 正在复制文件到 $OPT_DIR..."
|
||||
rm -rf "$OPT_DIR"
|
||||
mkdir -p "$OPT_DIR"
|
||||
cp -r ./* "$OPT_DIR/"
|
||||
chmod -R 755 "$OPT_DIR"
|
||||
chmod +x "$OPT_DIR/$APP_EXEC"
|
||||
|
||||
echo "🔗 正在创建软链接 $BIN_LINK..."
|
||||
ln -sf "$OPT_DIR/$APP_EXEC" "$BIN_LINK"
|
||||
|
||||
echo "📝 正在创建桌面快捷方式..."
|
||||
cat <<EOF >"$DESKTOP_DIR/${APP_NAME}.desktop"
|
||||
[Desktop Entry]
|
||||
Name=WeFlow
|
||||
Exec=$OPT_DIR/$APP_EXEC %U
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Icon=$APP_NAME
|
||||
StartupWMClass=WeFlow
|
||||
Comment=A local WeChat database decryption and analysis tool
|
||||
Categories=Utility;
|
||||
EOF
|
||||
chmod 644 "$DESKTOP_DIR/${APP_NAME}.desktop"
|
||||
|
||||
echo "🖼️ 正在安装图标..."
|
||||
if [ -f "$OPT_DIR/resources/icon.png" ]; then
|
||||
cp "$OPT_DIR/resources/icon.png" "$ICON_DIR/${APP_NAME}.png"
|
||||
chmod 644 "$ICON_DIR/${APP_NAME}.png"
|
||||
elif [ -f "$OPT_DIR/icon.png" ]; then
|
||||
cp "$OPT_DIR/icon.png" "$ICON_DIR/${APP_NAME}.png"
|
||||
chmod 644 "$ICON_DIR/${APP_NAME}.png"
|
||||
else
|
||||
echo "⚠️ 警告: 未找到图标文件,跳过图标安装。"
|
||||
fi
|
||||
|
||||
if command -v update-desktop-database >/dev/null 2>&1; then
|
||||
echo "🔄 更新桌面数据库..."
|
||||
update-desktop-database "$DESKTOP_DIR"
|
||||
fi
|
||||
|
||||
echo "✅ 安装完成!你现在可以在应用菜单中找到 WeFlow,或者在终端输入 'weflow' 启动。"
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -625,7 +625,7 @@
|
||||
|
||||
.bubble-content {
|
||||
background: var(--primary-gradient);
|
||||
color: #fff;
|
||||
color: var(--on-primary);
|
||||
border-radius: 18px 18px 4px 18px;
|
||||
padding: 10px 14px;
|
||||
font-size: 14px;
|
||||
@@ -1962,7 +1962,7 @@
|
||||
|
||||
.bubble-content {
|
||||
background: var(--primary);
|
||||
color: white;
|
||||
color: var(--on-primary);
|
||||
border-radius: 18px 18px 4px 18px;
|
||||
}
|
||||
}
|
||||
@@ -2453,15 +2453,15 @@
|
||||
|
||||
// 自己发送的消息中的引用样式
|
||||
.message-bubble.sent .quoted-message {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
border-left-color: rgba(255, 255, 255, 0.5);
|
||||
background: color-mix(in srgb, var(--on-primary) 12%, var(--primary));
|
||||
border-left-color: color-mix(in srgb, var(--on-primary) 36%, var(--primary));
|
||||
|
||||
.quoted-sender {
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
color: color-mix(in srgb, var(--on-primary) 92%, var(--primary));
|
||||
}
|
||||
|
||||
.quoted-text {
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
color: color-mix(in srgb, var(--on-primary) 80%, var(--primary));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ const AVATAR_ENRICH_BATCH_SIZE = 80
|
||||
const SEARCH_DEBOUNCE_MS = 120
|
||||
const VIRTUAL_ROW_HEIGHT = 76
|
||||
const VIRTUAL_OVERSCAN = 10
|
||||
const DEFAULT_CONTACTS_LOAD_TIMEOUT_MS = 3000
|
||||
const DEFAULT_CONTACTS_LOAD_TIMEOUT_MS = 10000
|
||||
const AVATAR_RECHECK_INTERVAL_MS = 24 * 60 * 60 * 1000
|
||||
|
||||
interface ContactsLoadSession {
|
||||
@@ -397,6 +397,10 @@ function ContactsPage() {
|
||||
displayName: contact.displayName,
|
||||
remark: contact.remark,
|
||||
nickname: contact.nickname,
|
||||
alias: contact.alias,
|
||||
labels: contact.labels,
|
||||
detailDescription: contact.detailDescription,
|
||||
region: contact.region,
|
||||
type: contact.type
|
||||
}))
|
||||
).catch((error) => {
|
||||
@@ -1110,6 +1114,16 @@ function ContactsPage() {
|
||||
<div className="detail-row"><span className="detail-label">用户名</span><span className="detail-value">{selectedContact.username}</span></div>
|
||||
<div className="detail-row"><span className="detail-label">昵称</span><span className="detail-value">{selectedContact.nickname || selectedContact.displayName}</span></div>
|
||||
{selectedContact.remark && <div className="detail-row"><span className="detail-label">备注</span><span className="detail-value">{selectedContact.remark}</span></div>}
|
||||
{selectedContact.alias && <div className="detail-row"><span className="detail-label">微信号</span><span className="detail-value">{selectedContact.alias}</span></div>}
|
||||
{selectedContact.labels && selectedContact.labels.length > 0 && (
|
||||
<div className="detail-row"><span className="detail-label">标签</span><span className="detail-value">{selectedContact.labels.join('、')}</span></div>
|
||||
)}
|
||||
{selectedContact.detailDescription && (
|
||||
<div className="detail-row"><span className="detail-label">个性签名</span><span className="detail-value">{selectedContact.detailDescription}</span></div>
|
||||
)}
|
||||
{selectedContact.region && (
|
||||
<div className="detail-row"><span className="detail-label">地区</span><span className="detail-value">{selectedContact.region}</span></div>
|
||||
)}
|
||||
<div className="detail-row"><span className="detail-label">类型</span><span className="detail-value">{getContactTypeName(selectedContact.type)}</span></div>
|
||||
{selectedContactSupportsSns && (
|
||||
<div className="detail-row">
|
||||
|
||||
@@ -568,7 +568,7 @@ const createTaskId = (): string => `task-${Date.now()}-${Math.random().toString(
|
||||
const CONTACT_ENRICH_TIMEOUT_MS = 7000
|
||||
const EXPORT_SNS_STATS_CACHE_STALE_MS = 12 * 60 * 60 * 1000
|
||||
const EXPORT_AVATAR_ENRICH_BATCH_SIZE = 80
|
||||
const DEFAULT_CONTACTS_LOAD_TIMEOUT_MS = 3000
|
||||
const DEFAULT_CONTACTS_LOAD_TIMEOUT_MS = 10000
|
||||
const EXPORT_REENTER_SESSION_SOFT_REFRESH_MS = 5 * 60 * 1000
|
||||
const EXPORT_REENTER_CONTACTS_SOFT_REFRESH_MS = 5 * 60 * 1000
|
||||
const EXPORT_REENTER_SNS_SOFT_REFRESH_MS = 3 * 60 * 1000
|
||||
@@ -1928,7 +1928,7 @@ function ExportPage() {
|
||||
|
||||
setIsContactsListLoading(true)
|
||||
try {
|
||||
const contactsResult = await window.electronAPI.chat.getContacts()
|
||||
const contactsResult = await window.electronAPI.chat.getContacts({ lite: true })
|
||||
if (contactsLoadVersionRef.current !== loadVersion) return
|
||||
|
||||
if (contactsResult.success && contactsResult.contacts) {
|
||||
@@ -3782,7 +3782,7 @@ function ExportPage() {
|
||||
|
||||
if (isStale()) return
|
||||
if (detailStatsPriorityRef.current) return
|
||||
const contactsResult = await withTimeout(window.electronAPI.chat.getContacts(), CONTACT_ENRICH_TIMEOUT_MS)
|
||||
const contactsResult = await withTimeout(window.electronAPI.chat.getContacts({ lite: true }), CONTACT_ENRICH_TIMEOUT_MS)
|
||||
if (isStale()) return
|
||||
|
||||
const contactsFromNetwork: ContactInfo[] = contactsResult?.success && contactsResult.contacts ? contactsResult.contacts : []
|
||||
|
||||
@@ -834,11 +834,13 @@
|
||||
}
|
||||
|
||||
.member-export-panel,
|
||||
.member-messages-panel {
|
||||
.member-messages-panel,
|
||||
.member-analytics-panel {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
min-height: 0;
|
||||
flex: 1;
|
||||
|
||||
.member-export-empty {
|
||||
padding: 20px;
|
||||
@@ -1521,29 +1523,73 @@
|
||||
}
|
||||
}
|
||||
|
||||
.stats-cards {
|
||||
.stats-overview {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(5, 1fr);
|
||||
gap: 12px;
|
||||
margin-bottom: 20px;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 16px;
|
||||
margin-bottom: 24px;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.stat-card {
|
||||
background: transparent;
|
||||
.stat-card {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
padding: 20px;
|
||||
background: var(--card-bg);
|
||||
border-radius: 12px;
|
||||
border: 1px solid var(--border-color);
|
||||
|
||||
.stat-icon {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: var(--primary-light);
|
||||
border-radius: 12px;
|
||||
padding: 16px;
|
||||
text-align: center;
|
||||
color: var(--primary);
|
||||
}
|
||||
|
||||
.value {
|
||||
display: block;
|
||||
.stat-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
|
||||
.stat-value {
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
color: var(--primary);
|
||||
margin-bottom: 4px;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.label {
|
||||
.stat-label {
|
||||
font-size: 13px;
|
||||
color: var(--text-secondary);
|
||||
color: var(--text-tertiary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.charts-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 16px;
|
||||
margin-bottom: 24px;
|
||||
|
||||
.chart-card {
|
||||
background: var(--card-bg);
|
||||
border-radius: 12px;
|
||||
border: 1px solid var(--border-color);
|
||||
padding: 20px;
|
||||
|
||||
&.wide {
|
||||
grid-column: span 2;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 15px;
|
||||
font-weight: 500;
|
||||
color: var(--text-primary);
|
||||
margin: 0 0 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useState, useEffect, useRef, useCallback, useMemo } from 'react'
|
||||
import { useLocation } from 'react-router-dom'
|
||||
import { Users, BarChart3, Clock, Image, Loader2, RefreshCw, Medal, Search, X, ChevronLeft, Copy, Check, Download, ChevronDown, MessageSquare } from 'lucide-react'
|
||||
import { Users, BarChart3, Clock, Image, Loader2, RefreshCw, Medal, Search, X, ChevronLeft, Copy, Check, Download, ChevronDown, MessageSquare, Calendar, PieChart, Hash, Smile } from 'lucide-react'
|
||||
import { Avatar } from '../components/Avatar'
|
||||
import ReactECharts from 'echarts-for-react'
|
||||
import DateRangePicker from '../components/DateRangePicker'
|
||||
@@ -37,7 +37,7 @@ interface GroupMessageRank {
|
||||
messageCount: number
|
||||
}
|
||||
|
||||
type AnalysisFunction = 'members' | 'memberMessages' | 'ranking' | 'activeHours' | 'mediaStats'
|
||||
type AnalysisFunction = 'members' | 'memberMessages' | 'memberAnalytics' | 'ranking' | 'activeHours' | 'mediaStats'
|
||||
type MemberExportFormat = 'chatlab' | 'chatlab-jsonl' | 'json' | 'arkme-json' | 'html' | 'txt' | 'excel' | 'weclone'
|
||||
|
||||
interface MemberMessageExportOptions {
|
||||
@@ -167,6 +167,8 @@ function GroupAnalyticsPage() {
|
||||
const [isExportingMembers, setIsExportingMembers] = useState(false)
|
||||
const [isExportingMemberMessages, setIsExportingMemberMessages] = useState(false)
|
||||
const [memberMessages, setMemberMessages] = useState<Message[]>([])
|
||||
const [memberAnalyticsData, setMemberAnalyticsData] = useState<any | null>(null)
|
||||
const [analyticsError, setAnalyticsError] = useState<string | null>(null)
|
||||
const [memberMessagesHasMore, setMemberMessagesHasMore] = useState(false)
|
||||
const [memberMessagesCursor, setMemberMessagesCursor] = useState(0)
|
||||
const [memberMessagesLoadingMore, setMemberMessagesLoadingMore] = useState(false)
|
||||
@@ -524,6 +526,7 @@ function GroupAnalyticsPage() {
|
||||
break
|
||||
}
|
||||
case 'memberMessages': {
|
||||
resetMemberMessageState(false)
|
||||
updateBackgroundTask(taskId, {
|
||||
detail: '正在读取成员列表与消息',
|
||||
progressText: '成员消息'
|
||||
@@ -566,7 +569,57 @@ function GroupAnalyticsPage() {
|
||||
})
|
||||
break
|
||||
}
|
||||
case 'memberAnalytics': {
|
||||
setMemberAnalyticsData(null)
|
||||
setAnalyticsError(null)
|
||||
updateBackgroundTask(taskId, {
|
||||
detail: '正在读取成员列表与消息分析',
|
||||
progressText: '成员分析'
|
||||
})
|
||||
const result = await window.electronAPI.groupAnalytics.getGroupMembers(targetGroup.username)
|
||||
if (isBackgroundTaskCancelRequested(taskId)) {
|
||||
finishBackgroundTask(taskId, 'canceled', { detail: '已停止后续加载,成员分析未继续写入' })
|
||||
return
|
||||
}
|
||||
if (!result.success || !result.data) {
|
||||
finishBackgroundTask(taskId, 'failed', { detail: result.error || '获取成员列表失败' })
|
||||
return
|
||||
}
|
||||
setMembers(result.data)
|
||||
let targetMember = preferredMemberUsername
|
||||
? result.data.find(m => m.username === preferredMemberUsername)
|
||||
: result.data.find(m => m.username === selectedMessageMemberUsername)
|
||||
if (!targetMember && result.data.length > 0) {
|
||||
targetMember = result.data[0]
|
||||
setSelectedMessageMemberUsername(targetMember.username)
|
||||
}
|
||||
if (!targetMember) {
|
||||
finishBackgroundTask(taskId, 'failed', { detail: '找不到目标成员' })
|
||||
return
|
||||
}
|
||||
updateBackgroundTask(taskId, {
|
||||
detail: `正在分析 ${targetMember.displayName || targetMember.username} 的发言记录`,
|
||||
progressText: '统计分析'
|
||||
})
|
||||
const analyticsResult = await window.electronAPI.groupAnalytics.getGroupMemberAnalytics(targetGroup.username, targetMember.username, startTime, endTime)
|
||||
if (isBackgroundTaskCancelRequested(taskId)) {
|
||||
finishBackgroundTask(taskId, 'canceled', { detail: '已停止后续加载,成员分析未继续写入' })
|
||||
return
|
||||
}
|
||||
if (analyticsResult.success && analyticsResult.data) {
|
||||
setMemberAnalyticsData(analyticsResult.data)
|
||||
finishBackgroundTask(taskId, 'completed', {
|
||||
detail: `分析完成,共计 ${analyticsResult.data.statistics?.totalMessages || 0} 条消息`,
|
||||
progressText: '已完成'
|
||||
})
|
||||
} else {
|
||||
setAnalyticsError(analyticsResult.error || '分析失败')
|
||||
finishBackgroundTask(taskId, 'failed', { detail: analyticsResult.error || '分析失败' })
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'ranking': {
|
||||
setRankings([])
|
||||
updateBackgroundTask(taskId, {
|
||||
detail: '正在计算群消息排行',
|
||||
progressText: '消息排行'
|
||||
@@ -584,6 +637,7 @@ function GroupAnalyticsPage() {
|
||||
break
|
||||
}
|
||||
case 'activeHours': {
|
||||
setActiveHours({})
|
||||
updateBackgroundTask(taskId, {
|
||||
detail: '正在计算群活跃时段',
|
||||
progressText: '活跃时段'
|
||||
@@ -601,6 +655,7 @@ function GroupAnalyticsPage() {
|
||||
break
|
||||
}
|
||||
case 'mediaStats': {
|
||||
setMediaStats(null)
|
||||
updateBackgroundTask(taskId, {
|
||||
detail: '正在统计群消息类型',
|
||||
progressText: '消息类型'
|
||||
@@ -633,6 +688,12 @@ function GroupAnalyticsPage() {
|
||||
return num.toLocaleString()
|
||||
}
|
||||
|
||||
const formatDate = (timestamp: number | null) => {
|
||||
if (!timestamp) return '-'
|
||||
const date = new Date(timestamp * 1000)
|
||||
return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`
|
||||
}
|
||||
|
||||
const sanitizeFileName = (name: string) => {
|
||||
return name.replace(/[<>:"/\\|?*]+/g, '_').trim()
|
||||
}
|
||||
@@ -764,6 +825,16 @@ function GroupAnalyticsPage() {
|
||||
await loadFunctionData('memberMessages', selectedGroup, member.username)
|
||||
}
|
||||
|
||||
const handleViewMemberAnalyticsFromModal = async (member: GroupMember) => {
|
||||
if (!selectedGroup) return
|
||||
setSelectedMember(null)
|
||||
setSelectedFunction('memberAnalytics')
|
||||
setSelectedMessageMemberUsername(member.username)
|
||||
setMessageMemberSearchKeyword('')
|
||||
setShowMessageMemberSelect(false)
|
||||
await loadFunctionData('memberAnalytics', selectedGroup, member.username)
|
||||
}
|
||||
|
||||
const handleOpenMemberExportModal = () => {
|
||||
setShowMessageMemberSelect(false)
|
||||
setShowFormatSelect(false)
|
||||
@@ -982,6 +1053,14 @@ function GroupAnalyticsPage() {
|
||||
<button
|
||||
type="button"
|
||||
className="member-modal-primary-btn"
|
||||
onClick={() => void handleViewMemberAnalyticsFromModal(selectedMember)}
|
||||
>
|
||||
<BarChart3 size={16} />
|
||||
<span>分析该成员聊天</span>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className="member-modal-secondary-btn"
|
||||
onClick={() => void handleViewMemberMessagesFromModal(selectedMember)}
|
||||
>
|
||||
<MessageSquare size={16} />
|
||||
@@ -1080,6 +1159,11 @@ function GroupAnalyticsPage() {
|
||||
<span>成员消息筛选与导出</span>
|
||||
<small>按成员查看群聊消息,并支持导出当前成员记录</small>
|
||||
</div>
|
||||
<div className="function-card" onClick={() => handleFunctionSelect('memberAnalytics')}>
|
||||
<PieChart size={32} />
|
||||
<span>群成员详细分析</span>
|
||||
<small>针对群聊内某一用户的群聊记录进行详细分析,如发信数量、活跃周期等</small>
|
||||
</div>
|
||||
<div className="function-card" onClick={() => handleFunctionSelect('ranking')}>
|
||||
<BarChart3 size={32} />
|
||||
<span>群聊发言排行</span>
|
||||
@@ -1104,6 +1188,7 @@ function GroupAnalyticsPage() {
|
||||
switch (selectedFunction) {
|
||||
case 'members': return '群成员查看'
|
||||
case 'memberMessages': return '成员消息筛选与导出'
|
||||
case 'memberAnalytics': return '群成员详细分析'
|
||||
case 'ranking': return '群聊发言排行'
|
||||
case 'activeHours': return '群聊活跃时段'
|
||||
case 'mediaStats': return '媒体内容统计'
|
||||
@@ -1282,6 +1367,187 @@ function GroupAnalyticsPage() {
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
{selectedFunction === 'memberAnalytics' && (
|
||||
<div className="member-analytics-panel">
|
||||
{members.length === 0 ? (
|
||||
<div className="member-message-empty">暂无群成员数据,请先刷新。</div>
|
||||
) : (
|
||||
<>
|
||||
<div className="member-message-toolbar" style={{ marginBottom: 20 }}>
|
||||
<div className="member-export-field" ref={messageMemberSelectDropdownRef}>
|
||||
<span>分析成员</span>
|
||||
<button
|
||||
type="button"
|
||||
className={`select-trigger member-message-select-trigger ${showMessageMemberSelect ? 'open' : ''}`}
|
||||
onClick={() => setShowMessageMemberSelect(prev => !prev)}
|
||||
>
|
||||
<div className="member-select-trigger-value">
|
||||
<Avatar
|
||||
src={selectedMessageMember?.avatarUrl}
|
||||
name={selectedMessageMember?.displayName || selectedMessageMember?.username || '?'}
|
||||
size={24}
|
||||
/>
|
||||
<span className="select-value">{selectedMessageMember?.displayName || selectedMessageMember?.username || '请选择成员'}</span>
|
||||
</div>
|
||||
<ChevronDown size={16} />
|
||||
</button>
|
||||
{showMessageMemberSelect && (
|
||||
<div className="select-dropdown member-select-dropdown">
|
||||
<div className="member-select-search">
|
||||
<Search size={14} />
|
||||
<input
|
||||
type="text"
|
||||
value={messageMemberSearchKeyword}
|
||||
onChange={e => setMessageMemberSearchKeyword(e.target.value)}
|
||||
placeholder="搜索 wxid / 昵称 / 备注 / 微信号"
|
||||
onClick={e => e.stopPropagation()}
|
||||
/>
|
||||
</div>
|
||||
<div className="member-select-options">
|
||||
{filteredMessageMemberOptions.length === 0 ? (
|
||||
<div className="member-select-empty">无匹配成员</div>
|
||||
) : (
|
||||
filteredMessageMemberOptions.map(member => (
|
||||
<button
|
||||
key={member.username}
|
||||
type="button"
|
||||
className={`select-option member-select-option ${selectedMessageMemberUsername === member.username ? 'active' : ''}`}
|
||||
onClick={() => {
|
||||
setSelectedMessageMemberUsername(member.username)
|
||||
setShowMessageMemberSelect(false)
|
||||
if (selectedGroup) {
|
||||
void loadFunctionData('memberAnalytics', selectedGroup, member.username)
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Avatar src={member.avatarUrl} name={member.displayName} size={28} />
|
||||
<span className="member-option-main">{member.displayName || member.username}</span>
|
||||
<span className="member-option-meta">
|
||||
wxid: {member.username}
|
||||
{member.alias ? ` · 微信号: ${member.alias}` : ''}
|
||||
{member.remark ? ` · 备注: ${member.remark}` : ''}
|
||||
{member.nickname ? ` · 昵称: ${member.nickname}` : ''}
|
||||
{member.groupNickname ? ` · 群昵称: ${member.groupNickname}` : ''}
|
||||
</span>
|
||||
</button>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
{analyticsError ? (
|
||||
<div className="member-message-empty">{analyticsError}</div>
|
||||
) : memberAnalyticsData ? (
|
||||
<div className="analytics-content-scrollable" style={{ padding: '0', display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0, overflowY: 'auto' }}>
|
||||
<div className="stats-overview">
|
||||
<div className="stat-card">
|
||||
<div className="stat-icon"><MessageSquare size={24} /></div>
|
||||
<div className="stat-info">
|
||||
<span className="stat-value">{formatNumber(memberAnalyticsData.statistics.sentMessages)}</span>
|
||||
<span className="stat-label">发信数量</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="stat-card">
|
||||
<div className="stat-icon"><Clock size={24} /></div>
|
||||
<div className="stat-info">
|
||||
<span className="stat-value">{memberAnalyticsData.statistics.activeDays}</span>
|
||||
<span className="stat-label">活跃天数</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="stat-card" style={{ gridColumn: 'span 2' }}>
|
||||
<div className="stat-icon"><Calendar size={24} /></div>
|
||||
<div className="stat-info">
|
||||
<span className="stat-value">
|
||||
{formatDate(memberAnalyticsData.statistics.firstMessageTime)} - {formatDate(memberAnalyticsData.statistics.lastMessageTime)}
|
||||
</span>
|
||||
<span className="stat-label">活跃周期</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="charts-grid">
|
||||
<div className="chart-card wide">
|
||||
<h3>活跃时段</h3>
|
||||
<div className="chart-wrapper">
|
||||
<ReactECharts
|
||||
option={{
|
||||
tooltip: { trigger: 'axis' },
|
||||
xAxis: { type: 'category', data: Array.from({ length: 24 }, (_, i) => `${i}时`) },
|
||||
yAxis: { type: 'value' },
|
||||
series: [{ type: 'bar', data: Array.from({ length: 24 }, (_, i) => memberAnalyticsData.timeDistribution[i] || 0), itemStyle: { color: '#07c160', borderRadius: [4, 4, 0, 0] } }]
|
||||
}}
|
||||
style={{ height: '300px', width: '100%' }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="chart-card wide">
|
||||
<h3>消息类型分布</h3>
|
||||
<div className="chart-wrapper">
|
||||
<ReactECharts
|
||||
option={{
|
||||
tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },
|
||||
series: [{
|
||||
type: 'pie',
|
||||
radius: ['40%', '70%'],
|
||||
data: [
|
||||
{ name: '文本', value: memberAnalyticsData.statistics.textMessages, itemStyle: { color: '#3b82f6' } },
|
||||
{ name: '图片', value: memberAnalyticsData.statistics.imageMessages, itemStyle: { color: '#22c55e' } },
|
||||
{ name: '语音', value: memberAnalyticsData.statistics.voiceMessages, itemStyle: { color: '#f97316' } },
|
||||
{ name: '视频', value: memberAnalyticsData.statistics.videoMessages, itemStyle: { color: '#a855f7' } },
|
||||
{ name: '表情', value: memberAnalyticsData.statistics.emojiMessages, itemStyle: { color: '#ec4899' } },
|
||||
{ name: '其他', value: memberAnalyticsData.statistics.otherMessages, itemStyle: { color: '#6b7280' } }
|
||||
].filter(item => item.value > 0),
|
||||
label: { show: true, formatter: '{b} {d}%' }
|
||||
}]
|
||||
}}
|
||||
style={{ height: '300px', width: '100%' }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="chart-card wide" style={{ display: 'flex', gap: '32px' }}>
|
||||
<div style={{ flex: 1 }}>
|
||||
<h3 style={{ display: 'flex', alignItems: 'center', gap: '6px' }}><Hash size={18} /> 常用语</h3>
|
||||
<div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>
|
||||
{memberAnalyticsData.commonPhrases && memberAnalyticsData.commonPhrases.length > 0 ? (
|
||||
memberAnalyticsData.commonPhrases.map((item: any, idx: number) => (
|
||||
<div key={idx} style={{ background: 'var(--bg-tertiary)', padding: '6px 12px', borderRadius: '8px', fontSize: '13px', display: 'flex', alignItems: 'center', gap: '6px', border: '1px solid var(--border-color)' }}>
|
||||
<span style={{ color: 'var(--text-primary)' }}>{item.phrase}</span>
|
||||
<span style={{ color: 'var(--text-tertiary)', fontSize: '11px' }}>{item.count}次</span>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<span style={{ color: 'var(--text-tertiary)', fontSize: '13px' }}>暂无常用语数据</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div style={{ flex: 1 }}>
|
||||
<h3 style={{ display: 'flex', alignItems: 'center', gap: '6px' }}><Smile size={18} /> 常用表情</h3>
|
||||
<div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>
|
||||
{memberAnalyticsData.commonEmojis && memberAnalyticsData.commonEmojis.length > 0 ? (
|
||||
memberAnalyticsData.commonEmojis.map((item: any, idx: number) => (
|
||||
<div key={idx} style={{ background: 'var(--bg-tertiary)', padding: '6px 12px', borderRadius: '8px', fontSize: '13px', display: 'flex', alignItems: 'center', gap: '6px', border: '1px solid var(--border-color)' }}>
|
||||
<span style={{ color: 'var(--text-primary)' }}>{item.emoji}</span>
|
||||
<span style={{ color: 'var(--text-tertiary)', fontSize: '11px' }}>{item.count}次</span>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<span style={{ color: 'var(--text-tertiary)', fontSize: '13px' }}>暂无表情包数据</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="content-loading"><Loader2 size={32} className="spin" /></div>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
{selectedFunction === 'ranking' && (
|
||||
<div className="rankings-list">
|
||||
{rankings.map((item, index) => (
|
||||
|
||||
+137
-86
@@ -1145,9 +1145,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
.quote-layout-group {
|
||||
margin-top: 14px;
|
||||
}
|
||||
|
||||
.quote-layout-picker {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
gap: 12px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
@@ -1155,32 +1159,146 @@
|
||||
.quote-layout-card {
|
||||
position: relative;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 16px;
|
||||
padding: 14px;
|
||||
background: var(--bg-primary);
|
||||
border-radius: 14px;
|
||||
padding: 14px 14px 12px;
|
||||
background: color-mix(in srgb, var(--primary) 6%, var(--bg-primary));
|
||||
color: inherit;
|
||||
cursor: pointer;
|
||||
text-align: left;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease, background 0.2s ease;
|
||||
transition: border-color 0.18s ease, box-shadow 0.18s ease, background 0.18s ease;
|
||||
|
||||
&:hover {
|
||||
border-color: color-mix(in srgb, var(--primary) 35%, var(--border-color));
|
||||
transform: translateY(-1px);
|
||||
border-color: color-mix(in srgb, var(--primary) 32%, var(--border-color));
|
||||
}
|
||||
|
||||
&.active {
|
||||
border-color: var(--primary);
|
||||
box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 14%, transparent);
|
||||
background: color-mix(in srgb, var(--bg-primary) 92%, var(--primary) 8%);
|
||||
border-color: color-mix(in srgb, var(--primary) 68%, var(--border-color));
|
||||
box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary) 12%, transparent);
|
||||
background: color-mix(in srgb, var(--primary) 10%, var(--bg-primary));
|
||||
}
|
||||
}
|
||||
|
||||
.quote-layout-card-header {
|
||||
.quote-layout-card-check {
|
||||
position: absolute;
|
||||
top: 12px;
|
||||
left: 12px;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border-radius: 50%;
|
||||
border: 1.5px solid color-mix(in srgb, var(--primary) 46%, var(--border-color));
|
||||
background: transparent;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
background: color-mix(in srgb, var(--primary) 78%, #6f8653);
|
||||
transform: scale(0);
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
&.active {
|
||||
border-color: color-mix(in srgb, var(--primary) 78%, var(--border-color));
|
||||
}
|
||||
|
||||
&.active::after {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
.quote-layout-preview-shell {
|
||||
padding-left: 22px;
|
||||
min-height: 72px;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .message-bubble {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
max-width: 70%;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .message-bubble.sent {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .message-bubble.sent .bubble-content {
|
||||
background: var(--primary);
|
||||
color: var(--on-primary);
|
||||
border-radius: 18px 18px 4px 18px;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .bubble-content {
|
||||
padding: 10px 14px;
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
word-break: break-word;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .message-text {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .quoted-message {
|
||||
background: rgba(0, 0, 0, 0.04);
|
||||
border-left: 2px solid var(--primary);
|
||||
padding: 6px 10px;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .quoted-sender {
|
||||
color: var(--primary);
|
||||
font-weight: 500;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .quoted-sender::after {
|
||||
content: ':';
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .quoted-text {
|
||||
color: var(--text-secondary);
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .message-bubble.sent .quoted-message {
|
||||
background: color-mix(in srgb, var(--on-primary) 12%, var(--primary));
|
||||
border-left-color: color-mix(in srgb, var(--on-primary) 36%, var(--primary));
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .message-bubble.sent .quoted-sender {
|
||||
color: color-mix(in srgb, var(--on-primary) 92%, var(--primary));
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .message-bubble.sent .quoted-text {
|
||||
color: color-mix(in srgb, var(--on-primary) 80%, var(--primary));
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .bubble-content.quote-layout-top .quoted-message {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.quote-layout-preview-chat .bubble-content.quote-layout-bottom .quoted-message {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.quote-layout-card-footer {
|
||||
margin-top: 8px;
|
||||
padding-left: 22px;
|
||||
}
|
||||
|
||||
.quote-layout-card-title-group {
|
||||
@@ -1190,89 +1308,22 @@
|
||||
}
|
||||
|
||||
.quote-layout-card-title {
|
||||
font-size: 14px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.quote-layout-card-desc {
|
||||
font-size: 12px;
|
||||
font-size: 11px;
|
||||
color: var(--text-tertiary);
|
||||
}
|
||||
|
||||
.quote-layout-card-check {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid var(--border-color);
|
||||
color: transparent;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&.active {
|
||||
border-color: var(--primary);
|
||||
background: var(--primary);
|
||||
color: #fff;
|
||||
@media (max-width: 760px) {
|
||||
.quote-layout-picker {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.quote-layout-preview {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
padding: 12px;
|
||||
border-radius: 12px;
|
||||
background: color-mix(in srgb, var(--bg-secondary) 92%, var(--bg-primary));
|
||||
border: 1px solid color-mix(in srgb, var(--border-color) 70%, transparent);
|
||||
min-height: 112px;
|
||||
|
||||
&.quote-bottom {
|
||||
.quote-layout-preview-message {
|
||||
order: 1;
|
||||
}
|
||||
|
||||
.quote-layout-preview-quote {
|
||||
order: 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.quote-layout-preview-quote {
|
||||
padding: 8px 10px;
|
||||
border-left: 2px solid var(--primary);
|
||||
border-radius: 8px;
|
||||
background: rgba(0, 0, 0, 0.04);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 3px;
|
||||
}
|
||||
|
||||
.quote-layout-preview-sender {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: var(--primary);
|
||||
}
|
||||
|
||||
.quote-layout-preview-text {
|
||||
font-size: 12px;
|
||||
color: var(--text-secondary);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.quote-layout-preview-message {
|
||||
align-self: flex-start;
|
||||
max-width: 88%;
|
||||
padding: 9px 12px;
|
||||
border-radius: 12px;
|
||||
background: color-mix(in srgb, var(--primary) 14%, var(--bg-primary));
|
||||
color: var(--text-primary);
|
||||
font-size: 13px;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.theme-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
|
||||
|
||||
+169
-77
@@ -32,6 +32,7 @@ const tabs: { id: SettingsTab; label: string; icon: React.ElementType }[] = [
|
||||
|
||||
const isMac = navigator.userAgent.toLowerCase().includes('mac')
|
||||
const isLinux = navigator.userAgent.toLowerCase().includes('linux')
|
||||
const isWindows = !isMac && !isLinux
|
||||
|
||||
const dbDirName = isMac ? '2.0b4.0.9 目录' : 'xwechat_files 目录'
|
||||
const dbPathPlaceholder = isMac
|
||||
@@ -102,6 +103,8 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
const [whisperProgressData, setWhisperProgressData] = useState<{ downloaded: number; total: number; speed: number }>({ downloaded: 0, total: 0, speed: 0 })
|
||||
const [whisperModelStatus, setWhisperModelStatus] = useState<{ exists: boolean; modelPath?: string; tokensPath?: string } | null>(null)
|
||||
|
||||
const [httpApiToken, setHttpApiToken] = useState('')
|
||||
|
||||
const formatBytes = (bytes: number) => {
|
||||
if (bytes === 0) return '0 B';
|
||||
const k = 1024;
|
||||
@@ -110,6 +113,25 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
||||
};
|
||||
|
||||
const generateRandomToken = async () => {
|
||||
// 生成 32 字符的十六进制随机字符串 (16 bytes)
|
||||
const array = new Uint8Array(16)
|
||||
crypto.getRandomValues(array)
|
||||
const token = Array.from(array).map(b => b.toString(16).padStart(2, '0')).join('')
|
||||
|
||||
setHttpApiToken(token)
|
||||
await configService.setHttpApiToken(token)
|
||||
showMessage('已生成并保存新的 Access Token', true)
|
||||
}
|
||||
|
||||
const clearApiToken = async () => {
|
||||
setHttpApiToken('')
|
||||
await configService.setHttpApiToken('')
|
||||
showMessage('已清除 Access Token,API 将允许无鉴权访问', true)
|
||||
}
|
||||
|
||||
|
||||
|
||||
const [autoTranscribeVoice, setAutoTranscribeVoice] = useState(false)
|
||||
const [transcribeLanguages, setTranscribeLanguages] = useState<string[]>(['zh'])
|
||||
|
||||
@@ -168,6 +190,7 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
// HTTP API 设置 state
|
||||
const [httpApiEnabled, setHttpApiEnabled] = useState(false)
|
||||
const [httpApiPort, setHttpApiPort] = useState(5031)
|
||||
const [httpApiHost, setHttpApiHost] = useState('127.0.0.1')
|
||||
const [httpApiRunning, setHttpApiRunning] = useState(false)
|
||||
const [httpApiMediaExportPath, setHttpApiMediaExportPath] = useState('')
|
||||
const [isTogglingApi, setIsTogglingApi] = useState(false)
|
||||
@@ -191,11 +214,11 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
checkWaylandStatus()
|
||||
}, [])
|
||||
|
||||
|
||||
|
||||
// 检查 Hello 可用性
|
||||
useEffect(() => {
|
||||
if (window.PublicKeyCredential) {
|
||||
void PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable().then(setHelloAvailable)
|
||||
}
|
||||
setHelloAvailable(isWindows)
|
||||
}, [])
|
||||
|
||||
// 检查 HTTP API 服务状态
|
||||
@@ -320,6 +343,16 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
const savedAuthEnabled = await window.electronAPI.auth.verifyEnabled()
|
||||
const savedAuthUseHello = await configService.getAuthUseHello()
|
||||
const savedIsLockMode = await window.electronAPI.auth.isLockMode()
|
||||
|
||||
const savedHttpApiToken = await configService.getHttpApiToken()
|
||||
if (savedHttpApiToken) setHttpApiToken(savedHttpApiToken)
|
||||
|
||||
const savedApiPort = await configService.getHttpApiPort()
|
||||
if (savedApiPort) setHttpApiPort(savedApiPort)
|
||||
|
||||
const savedApiHost = await configService.getHttpApiHost()
|
||||
if (savedApiHost) setHttpApiHost(savedApiHost)
|
||||
|
||||
setAuthEnabled(savedAuthEnabled)
|
||||
setAuthUseHello(savedAuthUseHello)
|
||||
setIsLockMode(savedIsLockMode)
|
||||
@@ -362,6 +395,8 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
const savedAnalyticsConsent = await configService.getAnalyticsConsent()
|
||||
setAnalyticsConsent(savedAnalyticsConsent ?? false)
|
||||
|
||||
|
||||
|
||||
// 如果语言列表为空,保存默认值
|
||||
if (!savedTranscribeLanguages || savedTranscribeLanguages.length === 0) {
|
||||
const defaultLanguages = ['zh']
|
||||
@@ -1061,9 +1096,9 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="form-group">
|
||||
<label>引用样式</label>
|
||||
<span className="form-hint">选择聊天中引用消息与正文的上下顺序,右侧预览会同步展示布局差异。</span>
|
||||
<div className="form-group quote-layout-group">
|
||||
<label>引用消息样式</label>
|
||||
<span className="form-hint">选择聊天中引用消息与正文的上下顺序,下方预览会同步展示布局差异。</span>
|
||||
<div className="quote-layout-picker" role="radiogroup" aria-label="引用样式选择">
|
||||
{[
|
||||
{
|
||||
@@ -1080,15 +1115,7 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
}
|
||||
].map(option => {
|
||||
const selected = quoteLayout === option.value
|
||||
const quotePreview = (
|
||||
<div className="quote-layout-preview-quote">
|
||||
<span className="quote-layout-preview-sender">张三</span>
|
||||
<span className="quote-layout-preview-text">这是一条被引用的消息</span>
|
||||
</div>
|
||||
)
|
||||
const messagePreview = (
|
||||
<div className="quote-layout-preview-message">这是当前发送的回复内容</div>
|
||||
)
|
||||
const isQuoteBottom = option.value === 'quote-bottom'
|
||||
|
||||
return (
|
||||
<button
|
||||
@@ -1104,27 +1131,37 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
role="radio"
|
||||
aria-checked={selected}
|
||||
>
|
||||
<div className="quote-layout-card-header">
|
||||
<span className={`quote-layout-card-check ${selected ? 'active' : ''}`} aria-hidden="true" />
|
||||
<div className="quote-layout-preview-shell">
|
||||
<div className="quote-layout-preview-chat">
|
||||
<div className="message-bubble sent">
|
||||
<div className={`bubble-content ${isQuoteBottom ? 'quote-layout-bottom' : 'quote-layout-top'}`}>
|
||||
{isQuoteBottom ? (
|
||||
<>
|
||||
<div className="message-text">拍得真不错!</div>
|
||||
<div className="quoted-message">
|
||||
<span className="quoted-sender">张三</span>
|
||||
<span className="quoted-text">那天去爬山的照片...</span>
|
||||
</div>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<div className="quoted-message">
|
||||
<span className="quoted-sender">张三</span>
|
||||
<span className="quoted-text">那天去爬山的照片...</span>
|
||||
</div>
|
||||
<div className="message-text">拍得真不错!</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="quote-layout-card-footer">
|
||||
<div className="quote-layout-card-title-group">
|
||||
<span className="quote-layout-card-title">{option.label}</span>
|
||||
<span className="quote-layout-card-desc">{option.description}</span>
|
||||
</div>
|
||||
<span className={`quote-layout-card-check ${selected ? 'active' : ''}`}>
|
||||
<Check size={14} />
|
||||
</span>
|
||||
</div>
|
||||
<div className={`quote-layout-preview ${option.value}`}>
|
||||
{option.value === 'quote-bottom' ? (
|
||||
<>
|
||||
{messagePreview}
|
||||
{quotePreview}
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
{quotePreview}
|
||||
{messagePreview}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</button>
|
||||
)
|
||||
@@ -1824,6 +1861,7 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
try {
|
||||
await window.electronAPI.http.stop()
|
||||
setHttpApiRunning(false)
|
||||
await configService.setHttpApiEnabled(false)
|
||||
showMessage('API 服务已停止', true)
|
||||
} catch (e: any) {
|
||||
showMessage(`操作失败: ${e}`, false)
|
||||
@@ -1837,10 +1875,14 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
setShowApiWarning(false)
|
||||
setIsTogglingApi(true)
|
||||
try {
|
||||
const result = await window.electronAPI.http.start(httpApiPort)
|
||||
const result = await window.electronAPI.http.start(httpApiPort, httpApiHost)
|
||||
if (result.success) {
|
||||
setHttpApiRunning(true)
|
||||
if (result.port) setHttpApiPort(result.port)
|
||||
|
||||
await configService.setHttpApiEnabled(true)
|
||||
await configService.setHttpApiPort(result.port || httpApiPort)
|
||||
|
||||
showMessage(`API 服务已启动,端口 ${result.port}`, true)
|
||||
} else {
|
||||
showMessage(`启动失败: ${result.error}`, false)
|
||||
@@ -1853,7 +1895,7 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
}
|
||||
|
||||
const handleCopyApiUrl = () => {
|
||||
const url = `http://127.0.0.1:${httpApiPort}`
|
||||
const url = `http://${httpApiHost}:${httpApiPort}`
|
||||
navigator.clipboard.writeText(url)
|
||||
showMessage('已复制 API 地址', true)
|
||||
}
|
||||
@@ -1885,21 +1927,75 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="form-group">
|
||||
<label>监听地址</label>
|
||||
<span className="form-hint">
|
||||
API 服务绑定的主机地址。默认 <code>127.0.0.1</code> 仅本机访问;Docker/N8N 等容器场景请改为 <code>0.0.0.0</code> 以允许外部访问(注意配合 Token 鉴权)
|
||||
</span>
|
||||
<input
|
||||
type="text"
|
||||
className="field-input"
|
||||
value={httpApiHost}
|
||||
placeholder="127.0.0.1"
|
||||
onChange={(e) => {
|
||||
const host = e.target.value.trim() || '127.0.0.1'
|
||||
setHttpApiHost(host)
|
||||
scheduleConfigSave('httpApiHost', () => configService.setHttpApiHost(host))
|
||||
}}
|
||||
disabled={httpApiRunning}
|
||||
style={{ width: 180, fontFamily: 'monospace' }}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="form-group">
|
||||
<label>服务端口</label>
|
||||
<span className="form-hint">API 服务监听的端口号(1024-65535)</span>
|
||||
<input
|
||||
type="number"
|
||||
className="field-input"
|
||||
value={httpApiPort}
|
||||
onChange={(e) => setHttpApiPort(parseInt(e.target.value, 10) || 5031)}
|
||||
disabled={httpApiRunning}
|
||||
style={{ width: 120 }}
|
||||
min={1024}
|
||||
max={65535}
|
||||
type="number"
|
||||
className="field-input"
|
||||
value={httpApiPort}
|
||||
onChange={(e) => {
|
||||
const port = parseInt(e.target.value, 10) || 5031
|
||||
setHttpApiPort(port)
|
||||
scheduleConfigSave('httpApiPort', () => configService.setHttpApiPort(port))
|
||||
}}
|
||||
disabled={httpApiRunning}
|
||||
style={{ width: 120 }}
|
||||
min={1024}
|
||||
max={65535}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="form-group">
|
||||
<label>Access Token (鉴权凭证)</label>
|
||||
<span className="form-hint">
|
||||
设置后,请求头需携带 <code>Authorization: Bearer <token></code>,
|
||||
或者参数中携带 <code>?access_token=<token></code>
|
||||
</span>
|
||||
<div style={{ display: 'flex', gap: '8px', marginTop: '8px' }}>
|
||||
<input
|
||||
type="text"
|
||||
className="field-input"
|
||||
value={httpApiToken}
|
||||
placeholder="留空表示不验证 Token"
|
||||
onChange={(e) => {
|
||||
const val = e.target.value
|
||||
setHttpApiToken(val)
|
||||
scheduleConfigSave('httpApiToken', () => configService.setHttpApiToken(val))
|
||||
}}
|
||||
style={{ flex: 1, fontFamily: 'monospace' }}
|
||||
/>
|
||||
<button className="btn btn-secondary" onClick={generateRandomToken}>
|
||||
<RefreshCw size={14} style={{ marginRight: 4 }} /> 随机生成
|
||||
</button>
|
||||
{httpApiToken && (
|
||||
<button className="btn btn-danger" onClick={clearApiToken} title="清除 Token">
|
||||
<Trash2 size={14} />
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{httpApiRunning && (
|
||||
<div className="form-group">
|
||||
<label>API 地址</label>
|
||||
@@ -1908,7 +2004,7 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
<input
|
||||
type="text"
|
||||
className="field-input"
|
||||
value={`http://127.0.0.1:${httpApiPort}`}
|
||||
value={`http://${httpApiHost}:${httpApiPort}`}
|
||||
readOnly
|
||||
/>
|
||||
<button className="btn btn-secondary" onClick={handleCopyApiUrl} title="复制">
|
||||
@@ -1955,18 +2051,18 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
<span className="form-hint">外部软件连接这个 SSE 地址即可接收新消息推送;需要先开启上方 `HTTP API 服务`</span>
|
||||
<div className="api-url-display">
|
||||
<input
|
||||
type="text"
|
||||
className="field-input"
|
||||
value={`http://127.0.0.1:${httpApiPort}/api/v1/push/messages`}
|
||||
readOnly
|
||||
type="text"
|
||||
className="field-input"
|
||||
value={`http://${httpApiHost}:${httpApiPort}/api/v1/push/messages${httpApiToken ? `?access_token=${httpApiToken}` : ''}`}
|
||||
readOnly
|
||||
/>
|
||||
<button
|
||||
className="btn btn-secondary"
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(`http://127.0.0.1:${httpApiPort}/api/v1/push/messages`)
|
||||
showMessage('已复制推送地址', true)
|
||||
}}
|
||||
title="复制"
|
||||
className="btn btn-secondary"
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(`http://${httpApiHost}:${httpApiPort}/api/v1/push/messages${httpApiToken ? `?access_token=${httpApiToken}` : ''}`)
|
||||
showMessage('已复制推送地址', true)
|
||||
}}
|
||||
title="复制"
|
||||
>
|
||||
<Copy size={16} />
|
||||
</button>
|
||||
@@ -1980,7 +2076,7 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
<div className="api-item">
|
||||
<div className="api-endpoint">
|
||||
<span className="method get">GET</span>
|
||||
<code>{`http://127.0.0.1:${httpApiPort}/api/v1/push/messages`}</code>
|
||||
<code>{`http://${httpApiHost}:${httpApiPort}/api/v1/push/messages`}</code>
|
||||
</div>
|
||||
<p className="api-desc">通过 SSE 长连接接收消息事件,建议接收端按 `messageKey` 去重。</p>
|
||||
<div className="api-params">
|
||||
@@ -2037,33 +2133,29 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
|
||||
showMessage('请输入当前密码以开启 Hello', false)
|
||||
return
|
||||
}
|
||||
if (!isWindows) {
|
||||
showMessage('当前系统不支持 Windows Hello', false)
|
||||
return
|
||||
}
|
||||
setIsSettingHello(true)
|
||||
try {
|
||||
const challenge = new Uint8Array(32)
|
||||
window.crypto.getRandomValues(challenge)
|
||||
|
||||
const credential = await navigator.credentials.create({
|
||||
publicKey: {
|
||||
challenge,
|
||||
rp: { name: 'WeFlow', id: 'localhost' },
|
||||
user: { id: new Uint8Array([1]), name: 'user', displayName: 'User' },
|
||||
pubKeyCredParams: [{ alg: -7, type: 'public-key' }],
|
||||
authenticatorSelection: { userVerification: 'required' },
|
||||
timeout: 60000
|
||||
}
|
||||
})
|
||||
|
||||
if (credential) {
|
||||
// 存储密码作为 Hello Secret,以便 Hello 解锁时能派生密钥
|
||||
await window.electronAPI.auth.setHelloSecret(helloPassword)
|
||||
setAuthUseHello(true)
|
||||
setHelloPassword('')
|
||||
showMessage('Windows Hello 设置成功', true)
|
||||
const verifyResult = await window.electronAPI.auth.hello('请验证您的身份以开启 Windows Hello')
|
||||
if (!verifyResult.success) {
|
||||
showMessage(verifyResult.error || 'Windows Hello 验证失败', false)
|
||||
return
|
||||
}
|
||||
|
||||
const saveResult = await window.electronAPI.auth.setHelloSecret(helloPassword)
|
||||
if (!saveResult.success) {
|
||||
showMessage('Windows Hello 配置保存失败', false)
|
||||
return
|
||||
}
|
||||
|
||||
setAuthUseHello(true)
|
||||
setHelloPassword('')
|
||||
showMessage('Windows Hello 设置成功', true)
|
||||
} catch (e: any) {
|
||||
if (e.name !== 'NotAllowedError') {
|
||||
showMessage(`Windows Hello 设置失败: ${e.message}`, false)
|
||||
}
|
||||
showMessage(`Windows Hello 设置失败: ${e?.message || String(e)}`, false)
|
||||
} finally {
|
||||
setIsSettingHello(false)
|
||||
}
|
||||
|
||||
+47
-33
@@ -13,6 +13,7 @@ import './WelcomePage.scss'
|
||||
|
||||
const isMac = navigator.userAgent.toLowerCase().includes('mac')
|
||||
const isLinux = navigator.userAgent.toLowerCase().includes('linux')
|
||||
const isWindows = !isMac && !isLinux
|
||||
|
||||
const dbDirName = isMac ? '2.0b4.0.9 目录' : 'xwechat_files 目录'
|
||||
const dbPathPlaceholder = isMac
|
||||
@@ -46,6 +47,19 @@ const formatDbKeyFailureMessage = (error?: string, logs?: string[]): string => {
|
||||
return `${base};最近状态:${tailLogs.join(' | ')}`
|
||||
}
|
||||
|
||||
const normalizeDbKeyStatusMessage = (message: string): string => {
|
||||
if (isWindows && message.includes('Hook安装成功')) {
|
||||
return '已准备就绪,现在登录微信或退出登录后重新登录微信'
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
const isDbKeyReadyMessage = (message: string): boolean => (
|
||||
message.includes('现在可以登录')
|
||||
|| message.includes('Hook安装成功')
|
||||
|| message.includes('已准备就绪,现在登录微信或退出登录后重新登录微信')
|
||||
)
|
||||
|
||||
function WelcomePage({ standalone = false }: WelcomePageProps) {
|
||||
const navigate = useNavigate()
|
||||
const { isDbConnected, setDbConnected, setLoading } = useAppStore()
|
||||
@@ -89,9 +103,7 @@ function WelcomePage({ standalone = false }: WelcomePageProps) {
|
||||
|
||||
// 检查 Hello 可用性
|
||||
useEffect(() => {
|
||||
if (window.PublicKeyCredential) {
|
||||
void PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable().then(setHelloAvailable)
|
||||
}
|
||||
setHelloAvailable(isWindows)
|
||||
}, [])
|
||||
|
||||
async function sha256(message: string) {
|
||||
@@ -103,35 +115,27 @@ function WelcomePage({ standalone = false }: WelcomePageProps) {
|
||||
}
|
||||
|
||||
const handleSetupHello = async () => {
|
||||
if (!isWindows) {
|
||||
setError('当前系统不支持 Windows Hello')
|
||||
return
|
||||
}
|
||||
if (!authPassword || authPassword !== authConfirmPassword) {
|
||||
setError('请先设置并确认应用密码,再开启 Windows Hello')
|
||||
return
|
||||
}
|
||||
|
||||
setIsSettingHello(true)
|
||||
try {
|
||||
// 注册凭证 (WebAuthn)
|
||||
const challenge = new Uint8Array(32)
|
||||
window.crypto.getRandomValues(challenge)
|
||||
|
||||
const credential = await navigator.credentials.create({
|
||||
publicKey: {
|
||||
challenge,
|
||||
rp: { name: 'WeFlow', id: 'localhost' },
|
||||
user: {
|
||||
id: new Uint8Array([1]),
|
||||
name: 'user',
|
||||
displayName: 'User'
|
||||
},
|
||||
pubKeyCredParams: [{ alg: -7, type: 'public-key' }],
|
||||
authenticatorSelection: { userVerification: 'required' },
|
||||
timeout: 60000
|
||||
}
|
||||
})
|
||||
|
||||
if (credential) {
|
||||
setEnableHello(true)
|
||||
// 成功提示?
|
||||
const result = await window.electronAPI.auth.hello('请验证您的身份以开启 Windows Hello')
|
||||
if (!result.success) {
|
||||
setError(`Windows Hello 设置失败: ${result.error || '验证失败'}`)
|
||||
return
|
||||
}
|
||||
|
||||
setEnableHello(true)
|
||||
setError('')
|
||||
} catch (e: any) {
|
||||
if (e.name !== 'NotAllowedError') {
|
||||
setError('Windows Hello 设置失败: ' + e.message)
|
||||
}
|
||||
setError(`Windows Hello 设置失败: ${e?.message || String(e)}`)
|
||||
} finally {
|
||||
setIsSettingHello(false)
|
||||
}
|
||||
@@ -139,8 +143,9 @@ function WelcomePage({ standalone = false }: WelcomePageProps) {
|
||||
|
||||
useEffect(() => {
|
||||
const removeDb = window.electronAPI.key.onDbKeyStatus((payload: { message: string; level: number }) => {
|
||||
setDbKeyStatus(payload.message)
|
||||
if (payload.message.includes('现在可以登录') || payload.message.includes('Hook安装成功')) {
|
||||
const normalizedMessage = normalizeDbKeyStatusMessage(payload.message)
|
||||
setDbKeyStatus(normalizedMessage)
|
||||
if (isDbKeyReadyMessage(normalizedMessage)) {
|
||||
window.electronAPI.notification?.show({
|
||||
title: 'WeFlow 准备就绪',
|
||||
content: '现在可以登录微信了',
|
||||
@@ -487,7 +492,17 @@ function WelcomePage({ standalone = false }: WelcomePageProps) {
|
||||
const hash = await sha256(authPassword)
|
||||
await configService.setAuthEnabled(true)
|
||||
await configService.setAuthPassword(hash)
|
||||
await configService.setAuthUseHello(enableHello)
|
||||
if (enableHello) {
|
||||
const helloResult = await window.electronAPI.auth.setHelloSecret(authPassword)
|
||||
if (!helloResult.success) {
|
||||
setError('Windows Hello 配置保存失败')
|
||||
setLoading(false)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
await window.electronAPI.auth.clearHelloSecret()
|
||||
await configService.setAuthUseHello(false)
|
||||
}
|
||||
}
|
||||
|
||||
await configService.setOnboardingDone(true)
|
||||
@@ -761,8 +776,7 @@ function WelcomePage({ standalone = false }: WelcomePageProps) {
|
||||
)}
|
||||
</div>
|
||||
|
||||
{dbKeyStatus && <div className={`status-message ${dbKeyStatus.includes('现在可以登录') || dbKeyStatus.includes('Hook安装成功') ? 'is-success' : ''}`}>{dbKeyStatus}</div>}
|
||||
<div className="field-hint">点击自动获取后微信将重启,请留意弹窗提示</div>
|
||||
{dbKeyStatus && <div className={`status-message ${isDbKeyReadyMessage(dbKeyStatus) ? 'is-success' : ''}`}>{dbKeyStatus}</div>}
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
+65
-3
@@ -64,6 +64,10 @@ export const CONFIG_KEYS = {
|
||||
NOTIFICATION_POSITION: 'notificationPosition',
|
||||
NOTIFICATION_FILTER_MODE: 'notificationFilterMode',
|
||||
NOTIFICATION_FILTER_LIST: 'notificationFilterList',
|
||||
HTTP_API_TOKEN: 'httpApiToken',
|
||||
HTTP_API_ENABLED: 'httpApiEnabled',
|
||||
HTTP_API_PORT: 'httpApiPort',
|
||||
HTTP_API_HOST: 'httpApiHost',
|
||||
MESSAGE_PUSH_ENABLED: 'messagePushEnabled',
|
||||
WINDOW_CLOSE_BEHAVIOR: 'windowCloseBehavior',
|
||||
QUOTE_LAYOUT: 'quoteLayout',
|
||||
@@ -117,6 +121,17 @@ export async function getDbPath(): Promise<string | null> {
|
||||
return value as string | null
|
||||
}
|
||||
|
||||
// 获取api access_token
|
||||
export async function getHttpApiToken(): Promise<string> {
|
||||
const value = await config.get(CONFIG_KEYS.HTTP_API_TOKEN)
|
||||
return (value as string) || ''
|
||||
}
|
||||
|
||||
// 设置access_token
|
||||
export async function setHttpApiToken(token: string): Promise<void> {
|
||||
await config.set(CONFIG_KEYS.HTTP_API_TOKEN, token)
|
||||
}
|
||||
|
||||
// 设置数据库路径
|
||||
export async function setDbPath(path: string): Promise<void> {
|
||||
await config.set(CONFIG_KEYS.DB_PATH, path)
|
||||
@@ -663,6 +678,9 @@ export interface ContactsListCacheContact {
|
||||
remark?: string
|
||||
nickname?: string
|
||||
alias?: string
|
||||
labels?: string[]
|
||||
detailDescription?: string
|
||||
region?: string
|
||||
type: 'friend' | 'group' | 'official' | 'former_friend' | 'other'
|
||||
}
|
||||
|
||||
@@ -1137,16 +1155,18 @@ export async function setSnsPageCache(
|
||||
export async function getContactsLoadTimeoutMs(): Promise<number> {
|
||||
const value = await config.get(CONFIG_KEYS.CONTACTS_LOAD_TIMEOUT_MS)
|
||||
if (typeof value === 'number' && Number.isFinite(value) && value >= 1000 && value <= 60000) {
|
||||
return Math.floor(value)
|
||||
const normalized = Math.floor(value)
|
||||
// 兼容历史默认值 3000ms:自动提升到新的更稳妥阈值。
|
||||
return normalized === 3000 ? 10000 : normalized
|
||||
}
|
||||
return 3000
|
||||
return 10000
|
||||
}
|
||||
|
||||
// 设置通讯录加载超时阈值(毫秒)
|
||||
export async function setContactsLoadTimeoutMs(timeoutMs: number): Promise<void> {
|
||||
const normalized = Number.isFinite(timeoutMs)
|
||||
? Math.min(60000, Math.max(1000, Math.floor(timeoutMs)))
|
||||
: 3000
|
||||
: 10000
|
||||
await config.set(CONFIG_KEYS.CONTACTS_LOAD_TIMEOUT_MS, normalized)
|
||||
}
|
||||
|
||||
@@ -1176,6 +1196,11 @@ export async function getContactsListCache(scopeKey: string): Promise<ContactsLi
|
||||
remark: typeof item.remark === 'string' ? item.remark : undefined,
|
||||
nickname: typeof item.nickname === 'string' ? item.nickname : undefined,
|
||||
alias: typeof item.alias === 'string' ? item.alias : undefined,
|
||||
labels: Array.isArray(item.labels)
|
||||
? Array.from(new Set(item.labels.map((label) => String(label || '').trim()).filter(Boolean)))
|
||||
: undefined,
|
||||
detailDescription: typeof item.detailDescription === 'string' ? (item.detailDescription.trim() || undefined) : undefined,
|
||||
region: typeof item.region === 'string' ? (item.region.trim() || undefined) : undefined,
|
||||
type: (type === 'friend' || type === 'group' || type === 'official' || type === 'former_friend' || type === 'other')
|
||||
? type
|
||||
: 'other'
|
||||
@@ -1210,6 +1235,11 @@ export async function setContactsListCache(scopeKey: string, contacts: ContactsL
|
||||
remark: contact?.remark ? String(contact.remark) : undefined,
|
||||
nickname: contact?.nickname ? String(contact.nickname) : undefined,
|
||||
alias: contact?.alias ? String(contact.alias) : undefined,
|
||||
labels: Array.isArray(contact?.labels)
|
||||
? Array.from(new Set(contact.labels.map((label) => String(label || '').trim()).filter(Boolean)))
|
||||
: undefined,
|
||||
detailDescription: contact?.detailDescription ? (String(contact.detailDescription).trim() || undefined) : undefined,
|
||||
region: contact?.region ? (String(contact.region).trim() || undefined) : undefined,
|
||||
type
|
||||
})
|
||||
}
|
||||
@@ -1457,3 +1487,35 @@ export async function getAnalyticsDenyCount(): Promise<number> {
|
||||
export async function setAnalyticsDenyCount(count: number): Promise<void> {
|
||||
await config.set(CONFIG_KEYS.ANALYTICS_DENY_COUNT, count)
|
||||
}
|
||||
|
||||
|
||||
// 获取 HTTP API 自动启动状态
|
||||
export async function getHttpApiEnabled(): Promise<boolean> {
|
||||
const value = await config.get(CONFIG_KEYS.HTTP_API_ENABLED)
|
||||
return value === true
|
||||
}
|
||||
|
||||
// 设置 HTTP API 自动启动状态
|
||||
export async function setHttpApiEnabled(enabled: boolean): Promise<void> {
|
||||
await config.set(CONFIG_KEYS.HTTP_API_ENABLED, enabled)
|
||||
}
|
||||
|
||||
// 获取 HTTP API 端口
|
||||
export async function getHttpApiPort(): Promise<number> {
|
||||
const value = await config.get(CONFIG_KEYS.HTTP_API_PORT)
|
||||
return typeof value === 'number' ? value : 5031
|
||||
}
|
||||
|
||||
// 设置 HTTP API 端口
|
||||
export async function setHttpApiPort(port: number): Promise<void> {
|
||||
await config.set(CONFIG_KEYS.HTTP_API_PORT, port)
|
||||
}
|
||||
|
||||
export async function getHttpApiHost(): Promise<string> {
|
||||
const value = await config.get(CONFIG_KEYS.HTTP_API_HOST)
|
||||
return typeof value === 'string' && value.trim() ? value.trim() : '127.0.0.1'
|
||||
}
|
||||
|
||||
export async function setHttpApiHost(host: string): Promise<void> {
|
||||
await config.set(CONFIG_KEYS.HTTP_API_HOST, host)
|
||||
}
|
||||
Vendored
+24
-2
@@ -219,7 +219,7 @@ export interface ElectronAPI {
|
||||
updateMessage: (sessionId: string, localId: number, createTime: number, newContent: string) => Promise<{ success: boolean; error?: string }>
|
||||
deleteMessage: (sessionId: string, localId: number, createTime: number, dbPathHint?: string) => Promise<{ success: boolean; error?: string }>
|
||||
resolveTransferDisplayNames: (chatroomId: string, payerUsername: string, receiverUsername: string) => Promise<{ payerName: string; receiverName: string }>
|
||||
getContacts: () => Promise<{
|
||||
getContacts: (options?: { lite?: boolean }) => Promise<{
|
||||
success: boolean
|
||||
contacts?: ContactInfo[]
|
||||
error?: string
|
||||
@@ -496,6 +496,28 @@ export interface ElectronAPI {
|
||||
}
|
||||
error?: string
|
||||
}>
|
||||
getGroupMemberAnalytics: (chatroomId: string, memberUsername: string, startTime?: number, endTime?: number) => Promise<{
|
||||
success: boolean
|
||||
data?: {
|
||||
statistics: {
|
||||
totalMessages: number
|
||||
textMessages: number
|
||||
imageMessages: number
|
||||
voiceMessages: number
|
||||
videoMessages: number
|
||||
emojiMessages: number
|
||||
otherMessages: number
|
||||
sentMessages: number
|
||||
receivedMessages: number
|
||||
firstMessageTime: number | null
|
||||
lastMessageTime: number | null
|
||||
activeDays: number
|
||||
messageTypeCounts: Record<number, number>
|
||||
}
|
||||
timeDistribution: Record<number, number>
|
||||
}
|
||||
error?: string
|
||||
}>
|
||||
getGroupMemberMessages: (
|
||||
chatroomId: string,
|
||||
memberUsername: string,
|
||||
@@ -838,7 +860,7 @@ export interface ElectronAPI {
|
||||
getLogs: () => Promise<string[]>
|
||||
}
|
||||
http: {
|
||||
start: (port?: number) => Promise<{ success: boolean; port?: number; error?: string }>
|
||||
start: (port?: number, host?: string) => Promise<{ success: boolean; port?: number; error?: string }>
|
||||
stop: () => Promise<{ success: boolean }>
|
||||
status: () => Promise<{ running: boolean; port: number; mediaExportPath: string }>
|
||||
}
|
||||
|
||||
@@ -37,6 +37,9 @@ export interface ContactInfo {
|
||||
remark?: string
|
||||
nickname?: string
|
||||
alias?: string
|
||||
labels?: string[]
|
||||
detailDescription?: string
|
||||
region?: string
|
||||
avatarUrl?: string
|
||||
type: 'friend' | 'group' | 'official' | 'former_friend' | 'other'
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user