在 PrimeNG 组件(例如 p-menu)中渲染 Unicode 符号(如 ™、® 等),无需额外转义或手动操作 DOM。只需在 TypeScript 字符串里使用 Unicode 转义序列(比如 \u2122、\u00AE),组件即可原生支持,操作极为简单。

PrimeNG 的菜单、按钮、标签等组件底层均基于标准 HTML 渲染,因此 JavaScript 字符串中的 Unicode 字面量完全兼容。你无需调用 DomSanitizer.bypassSecurityTrustHtml(),也无需手动解析 HTML 实体(例如 ™ 或 ™)。原因很简单:HTML 实体仅在模板层面需要解析,而 TypeScript 字符串中直接使用 Unicode 码点即可。
首先推荐最佳实践:直接使用 Unicode 转义序列。
定义菜单项时,将 Unicode 符号直接嵌入 label 字符串内:
this.menuItems = [
{ label: 'Application 1', icon: 'pi pi-fw', command: () => this.handleAction('app1') },
{ label: 'Application 2 \u2122', icon: 'pi pi-fw', command: () => this.handleAction('app2') }, // ™
{ label: 'Application 3 \u00AE', icon: 'pi pi-fw', command: () => this.handleAction('app3') } // ®
];
⚠️ 以下为不推荐的做法:
- 在字符串中直接写入
™或™—— 这会被当作纯文本显示,无法渲染出符号; - 错误依赖
DomSanitizer.bypassSecurityTrustHtml()—— p-menu 的 label 属性接收的是字符串(而非 HTML),强行绕过安全策略不仅无效,还可能引发类型错误或 XSS 风险; - 在模板中使用 innerHTML 绑定(例如
)—— 这会破坏 PrimeNG 的模板结构,并丢失事件绑定及图标对齐等内置功能。
进阶技巧:统一管理符号常量。
为便于后期维护,建议将常用符号提取为常量:
export const TRADEMARK = '\u2122'; // ™
export const REGISTERED = '\u00AE'; // ®
export const COPYRIGHT = '\u00A9'; // ©
// 使用示例
{ label: `My Product ${TRADEMARK}`, command: () => {} }
注意事项总结:
- PrimeNG v14 及以上版本中,所有基于
label: string的组件(p-menu、p-tabMenu、p-breadcrumb 等)均原生支持 Unicode 字符; - 确保项目源码文件编码为 UTF-8(现代 IDE 默认已满足,无需额外设置);
- 若从后端 API 获取包含符号的文本,需保证响应头 Content-Type 包含
charset=utf-8,且 JSON 字符串本身已正确编码(例如"title": "App\u2122"); - 避免混用 HTML 实体与 Unicode —— 保持语义一致,优先选用
\uXXXX形式。
采用这种方式,既能确保符号正确渲染,又能维持代码简洁性与安全性,真正实现“零配置”符号支持。
