diff --git a/Meshtastic/Extensions/String.swift b/Meshtastic/Extensions/String.swift index 6dd3cad5..d2ae1e5a 100644 --- a/Meshtastic/Extensions/String.swift +++ b/Meshtastic/Extensions/String.swift @@ -93,11 +93,24 @@ extension String { // Filter out variation selectors from the string var withoutVariationSelectors: String { - return self.unicodeScalars - .filter { scalar in - return !scalar.properties.isVariationSelector + var scalars: [UnicodeScalar] = [] + var previousWasASCII = false + + for scalar in self.unicodeScalars { + if scalar.properties.isVariationSelector { + // Only keep variation selector if the previous character was ASCII + if previousWasASCII { + scalars.append(scalar) + } + // No need to update previousWasASCII since variation selectors aren't characters + // Shouldn't have 2 in a row + } else { + scalars.append(scalar) + previousWasASCII = scalar.isASCII } - .compactMap { UnicodeScalar($0) } + } + + return scalars.compactMap { UnicodeScalar($0) } .map { String($0) } .joined() } @@ -106,7 +119,7 @@ extension String { // Looks ahead to make sure that the variation selector is not already applied. var addingVariationSelectors: String { var result = "" - var scalars = self.unicodeScalars + let scalars = self.unicodeScalars var index = scalars.startIndex while index < scalars.endIndex { let currentScalar = scalars[index] diff --git a/Meshtastic/Views/Bluetooth/Connect.swift b/Meshtastic/Views/Bluetooth/Connect.swift index 6d804e3f..09af4418 100644 --- a/Meshtastic/Views/Bluetooth/Connect.swift +++ b/Meshtastic/Views/Bluetooth/Connect.swift @@ -120,7 +120,7 @@ struct Connect: View { #endif Text("Num: \(String(node!.num))") Text("Short Name: \(node?.user?.shortName ?? "?")") - Text("Long Name: \(node?.user?.longName ?? "unknown".localized)") + Text("Long Name: \(node?.user?.longName?.addingVariationSelectors ?? "unknown".localized)") Text("BLE RSSI: \(connectedPeripheral.rssi)") Button { @@ -333,7 +333,7 @@ struct Connect: View { let localStats = node?.telemetries?.filtered(using: NSPredicate(format: "metricsType == 4")) let mostRecent = localStats?.lastObject as? TelemetryEntity - let activityAttributes = MeshActivityAttributes(nodeNum: Int(node?.num ?? 0), name: node?.user?.longName ?? "unknown") + let activityAttributes = MeshActivityAttributes(nodeNum: Int(node?.num ?? 0), name: node?.user?.longName?.addingVariationSelectors ?? "unknown") let future = Date(timeIntervalSinceNow: Double(timerSeconds)) let initialContentState = MeshActivityAttributes.ContentState(uptimeSeconds: UInt32(mostRecent?.uptimeSeconds ?? 0), diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 8e24e500..8e0dcfc3 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -341,7 +341,7 @@ struct Settings: View { /// Connected Node if node.num == bleManager.connectedPeripheral?.num ?? 0 { Label { - Text("BLE: \(node.user?.longName ?? "unknown".localized)") + Text("BLE: \(node.user?.longName?.addingVariationSelectors ?? "unknown".localized)") } icon: { Image(systemName: "antenna.radiowaves.left.and.right") } @@ -370,7 +370,7 @@ struct Settings: View { .tag(Int(node.num)) } else if !UserDefaults.enableAdministration { Label { - Text("Request Legacy Admin: \(node.user?.longName ?? "unknown".localized)") + Text("Request Legacy Admin: \(node.user?.longName?.addingVariationSelectors ?? "unknown".localized)") } icon: { Image(systemName: "rectangle.and.hand.point.up.left") }