网络运营商名称显示&SIM名称显示

本文详细解析了网络名称显示的优先级规则,包括EnhancedOperatorNameString、CommonPCNHandsetSpecificationOperatorNameString、NITZOperatorName、ROM等不同来源的网络名称。同时,解释了SIM名称的生成过程及其与网络名称的区别,为理解手机网络显示提供了全面的视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 网络名称显示这部分比較复杂。Spec对这也有明白的规定,依据其优先级由高往低介绍(其优先级參考TS 22.101),
1.       Enhanced Operator Name String。也就是Eons。此种方式的名称是存放在EF_PNN(PLMN Network Name, fid: 6FC5)和EF_OPL(Operator PLMN List, fid: 6FC6)中。
EF_OPL中存放的是LAC和EF_PNN中的Record Identifier,
EF_PNN中存放的是Network Name,也就是详细的名称了。
假设注冊上的网络是HPLMN,那么EF_OPL返回的Record Identifier就是1。
假设不是HPLMN的话,就依据LAC在EF_OPL中寻找相应的Record Identifier。


然后依据OPL的Record Identifier,在PNN中找相应的Network Name。


这里须要声明一下,Record Identifier是基于1的,而EF_PNN的记录是基于0的。

也就是说,Record Identifier是1。那匹配的是EF_PNN中的第0条记录。

这个分的代码能够參考SIMRecords.java中的getEonsIfExist()方法
 
2.       Common PCN Handset Specification Operator Name String,也就是CPHS ONS。须要当前注冊的是HPLMN网络,
a.       假设SIM中的CPHS ONS的长格式文件(fid:6F14, long name)读取成功,用此当作网络名称。
b.       假设SIM中的CPHS ONS的短格式文件(fid:6F18, short name)读取成功,用此当作网络名称。
这个分的代码能够參考SIMRecords.java中的读取CPHSOns文件的部分
 
 
3.       NITZ Operator Name
此名称是由所注冊的网络下发给手机的,參考TS22.042。假设网络有下发这个数据给手机。modem会通过”+CIEV: 10”把数据传给AP端,AP端会用这个数据来当成网络名称,另外AP端还会把这个数据和相应的网络PLMN一同记下来,当之后注冊上的网络仍是这个PLMN,这显示的网络名称还会是这个网络名称。
这部分的代码能够參考ril_nw.c中的onNitzOperNameReceived()
 
4.       ROM
这一个是存储在手机flash中的,眼下的存储方式是xml文件。假设是有打开支持MVNO的option。那么下面xml都依次读取,假设读取到就终止往下读了。

假设没有MVNO,那么只读取spn-conf.xml。

假设没有读取到那么显示plmn号了。


Virtual-spn-conf-by-efspn.xml
Virtual-spn-conf-by-imsi.xml
Virtual-spn-conf-by-efpnn.xml
Virtual-spn-conf-by-efgid1.xml
Spn-conf.xml

这个分的代码能够參考ril.java中的 lookupOperatorName()方法和SpnOverride类

二 接下来看还有一个重要的名称,Service Provider Name。也就是SPN。

SPN是卡中的一个文件。fid是6F46。

读取SPN首先要看看SST中是否有这个栏位,而且这个栏位是否是activity的。


常常遇到有时候在keyguard上显示的名称和状态栏上的不一样,或者明明是这个运营商的却显示另外一个运营商的名称等等奇怪的现象,这些现象有些是和SPN是有关系的。

所以我们须要了解一下SPN的显示规则。

SPN有一个字节来规定其显示规则(參考Spec TS 31.102)
这一个字节仅用到第一和第二位,
(1)当注冊到网络是HPLMN或者是在plmn属于EF_SPDI中的网络时(默认显示SPN)。该字节的第一位的取值意义:
1:须要显示PLMN
0:不须要显示PLMN
(2)当注冊到网络不是HPLMN也不在EF_SPDI中的网络时(默认显示PLMN),该字节的第二位取值意义:
1:不须要显示SPN
0:要显示SPN

这两个bit组成的值叫做display condition。这里的plmn指的是网络名称哦,不是指plmn号。所以会有遇到仅仅显示spn而不显示网络名称的情况,而且spn的名称是sim文件里读出来的,其内容不确定的。
 
三 SIM的名称
 
非常多人对这个SIM的名称和网络名称有困扰。事实上这是两个不同的东西。SIM的名称相对于网络名称简单得多。SIM 名称是SIM info中的一个栏位,sim info是Telephony.db中的一个table。

当在SIM Framework初始化时候会下如一个默认的字串当作sim名称,这个字串的内容就是com.mediatek.internal.R.string.new_sim。在SIM ready时会去读取SIM的各种record,在record读取完毕之后才依据mcc/mnc到xml去那相应的名称,然后设定到数据库其中。这个就是sim的默认名称了。假设开机之后是打开飞行模式的。那么由于不会去读取sim record,所以sim的默认名称会一直都是com.mediatek.internal.R.string.new_sim。
 
读取record设定sim的默认名称的代码是在SIMRecords.java中的onAllRecordedsLoaded()方法,通过mcc/mnc到lookupOperatorName中读取xml(注意,有些特殊的mcc/mnc是直接读R.string中的数据)。然后通过setDefaultNameForNewSIM设定进去。

<think>我们正在解决如何在QPushButton中显示'&amp;'字符的问题。在Qt中,'&amp;'字符通常用于指定快捷键(例如"&amp;Save"会显示为"Save",并且按下Alt+S会触发按钮)。如果我们想要在按钮文本中显示实际的'&amp;'字符而不是用作快捷键指示符,我们需要对文本进行转义。根据Qt的文档,我们可以使用双写'&amp;'的方式,即"&amp;&amp;"来表示一个单独的'&amp;'字符。例如:-如果我们设置按钮文本为"Save&amp;&amp;Exit",那么按钮将显示为"Save&amp;Exit"。-这样,第一个'&amp;'后面的第二个'&amp;'被当作普通字符显示,而不会创建快捷键。另外,我们也可以使用`QString`的`fromHtml`方法或者使用`QTextDocument`来解析HTML实体,但这种方法比较复杂,而且对于简单的按钮文本来说,使用双写'&amp;'是最直接推荐的方法。因此,解决方案是:在设置按钮文本时,将每一个想要显示的'&amp;'替换成两个连续的'&amp;'。示例代码:```cppQPushButton*button=newQPushButton(this);button->setText("Save&amp;&amp;Exit");//显示为:Save&amp;Exit```这样,按钮就会显示"Save&amp;Exit",并且不会将'E'作为快捷键。另外,如果我们需要动态生成文本,文本中可能包含'&amp;',我们可以使用一个函数来替换所有的单个'&amp;'为双'&amp;'。例如:```cppQStringescapeAmpersand(constQString&amp;original){returnoriginal.replace("&amp;","&amp;&amp;");}//使用button->setText(escapeAmpersand("Save&amp;Exit"));//同样显示为:Save&amp;Exit```注意:这种方法只适用于按钮文本中需要显示'&amp;'的情况,对于其他控件(如QLabel)如果也需要显示'&amp;',同样可以使用双写'&amp;'的方式,但QLabel默认支持富文本,也可以使用HTML实体`&amp;`,不过对于按钮来说,使用双写'&amp;'是最简单的方法。参考引用:-引用[2]中提到了QPushButton的构造函数设置文本的方法,我们可以通过setText来设置按钮文本。-引用[3]中提到了setText函数,所以我们可以用上述方法设置文本。因此,总结如下:-问题:如何在QPushButton中显示'&amp;'字符?-解决:在设置文本时,将每一个需要显示的'&amp;'写成两个连续的'&amp;',即"&amp;&amp;"。示例代码片段:```cpp//创建一个按钮,并显示文本"Click&amp;&amp;Go"QPushButton*button=newQPushButton("Click&amp;&amp;Go",this);```这样,按钮就会显示为"Click&amp;Go"。如果文本是从外部获取的(比如用户输入、文件读取等),并且可能包含'&amp;',那么我们需要在设置文本之前进行替换,确保每一个'&amp;'都被替换成"&amp;&amp;"。例如:```cppQStringuserInput=...;//从某处获取的字符串button->setText(userInput.replace("&amp;","&amp;&amp;"));```但是请注意,如果文本中已经存在双写'&amp;'(比如我们想要显示"&amp;&amp;"),那么替换后就会变成"&amp;&amp;&amp;&amp;",这样显示出来是"&amp;&amp;"。所以这个替换是安全的,因为每个'&amp;'都需要被转义。因此,我们可以放心地将文本中的所有'&amp;'替换成"&amp;&amp;"来确保正确显示。另外,如果文本中本来就有一些双写'&amp;'(表示显示一个'&amp;'),那么再次替换会导致显示错误。所以,如果文本是用户提供的,并且用户可能已经使用了双写'&amp;'来显示单个'&amp;',那么我们就不应该再替换了。所以,通常我们建议在设置按钮文本时,由程序员自己确保使用双写'&amp;'。如果文本是动态的并且不确定,那么我们需要确保在生成文本时正确转义。在Qt中,还有一个全局的设置可以禁用快捷键识别,但是这样会同时禁用所有控件的快捷键(比如按钮、菜单等)。我们可以使用:```cppQCoreApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);```但这个方法并不适用于我们的问题,因为它只是禁用了窗口的帮助按钮,而不是快捷键。实际上,Qt并没有提供全局禁用快捷键的简单方法。所以,转义文本中的'&amp;'是正确的方法。因此,推荐使用双写'&amp;'的方法。相关问题:1.如何在Qt中为按钮设置快捷键?2.如何禁用Qt按钮的快捷键?3.如何在QLabel中显示'&amp;'字符?4.Qt中如何设置按钮的图标文本?5.如何动态改变按钮的文本并保持'&amp;'字符的正确显示?注意:在回答中,我们引用了[2][3],因为这两个引用涉及了QPushButton的文本设置。</think>### 在 QPushButton 中显示 '&amp;' 字符的解决方案 在 Qt 中,`&amp;` 字符默认用作快捷键指示符(如 "&amp;Save" 会显示为 "Save",并启用 Alt+S 快捷键)。要显示实际的 `&amp;` 字符,有以下几种解决方案: #### 方法 1:使用双 `&amp;&amp;` 转义(推荐) ```cpp QPushButton* button = new QPushButton("Save &amp;&amp; Exit", this); // 显示为: Save &amp; Exit ``` - **原理**:使用两个连续的 `&amp;&amp;` 表示一个实际的 `&amp;` 字符 - **优点**:最简单直接的方法,无需额外代码 #### 方法 2:使用 HTML 实体编码 ```cpp QPushButton* button = new QPushButton("Save &amp; Exit", this); // 显示为: Save &amp; Exit ``` - **注意**:需要启用富文本支持 - **限制**:可能影响性能,不适用于纯文本场景 #### 方法 3:通过 `QString` 替换处理 ```cpp QString buttonText = "Save &amp; Exit"; buttonText.replace("&amp;", "&amp;&amp;"); // 替换单个&amp;为双&amp;&amp; QPushButton* button = new QPushButton(buttonText, this); ``` #### 方法 4:禁用快捷键识别(全局设置) ```cpp // 在 main.cpp 中禁用全局快捷键识别 QCoreApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton); ``` - **效果**:所有 `&amp;` 字符将按字面显示 - **影响**:会禁用所有控件的快捷键功能 #### 完整示例代码 ```cpp #include <QApplication> #include <QPushButton> #include <QVBoxLayout> #include <QDialog> int main(int argc, char *argv[]) { QApplication app(argc, argv); QDialog dialog; QVBoxLayout layout(&amp;dialog); // 方法 1: 双&amp;&amp;转义 QPushButton* btn1 = new QPushButton("Text &amp;&amp; Symbol", &amp;dialog); // 方法 2: HTML实体 QPushButton* btn2 = new QPushButton("HTML &amp; Entity", &amp;dialog); // 方法 3: 动态替换 QString text = "Dynamic &amp; Processing"; QPushButton* btn3 = new QPushButton(text.replace("&amp;", "&amp;&amp;"), &amp;dialog); layout.addWidget(btn1); layout.addWidget(btn2); layout.addWidget(btn3); dialog.show(); return app.exec(); } ``` #### 关键注意事项 1. **默认行为**:单个 `&amp;` 会被解析为快捷键指示符(如 "&amp;Save" → "S̲ave") 2. **特殊场景**:在菜单项中显示 `&amp;` 时,同样适用双 `&amp;&amp;` 规则 3. **性能考虑**:优先使用双 `&amp;&amp;` 转义,避免不必要的 HTML 解析 4. **布局影响**:按钮尺寸会根据文本内容自动调整,无需额外处理[^2] > 在大多数情况下,**方法 1(双 &amp;&amp; 转义)** 是最简单可靠的解决方案,能正确处理 `&amp;` 字符的显示问题,同时保留快捷键功能[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值