作为一个采访问题,通常只询问有关就地交换8位项目以颠倒其顺序的技术位(无论这些位实际上可能代表什么字符)。
同时,特别是如果您正在采访相对资深的人士,您至少可以希望听到一些有关规格和输入形式的问题。即使您将它们引回只是交换8位项目的简单情况,也要知道它们是否比这更广泛地考虑可能是有价值的。
如果您确实需要处理各种各样的输入,则只需考虑“堆栈”(有点像网络堆栈)。您必须将软件构建为多个层次,每个层次均以特定顺序应用一组相当特定的转换。这使您可以使转换的每个部分足够简单,以使您可以控制它,并有合理的机会使其符合要求。
我将概述至少已发现可行的一种可能性。我是第一个承认也许会有其他人有更好想法的人。至少在我看来,这有点像蛮力工程,几乎没有真正的优雅。
通常,您首先需要将任何其他表示形式转换为UCS-4(又名UTF-32)。为此,您通常宁愿依赖用户的输入,也不愿自己尝试输入。在某些情况下,您可以确保特定的八位位组序列不遵循特定编码方案的规则,但是很少(如果有的话)可以确保它确实遵循特定的编码方案。
下一步是可选的。您可以将输入标准化为四种Unicode标准化形式之一。在这种情况下,您可能要应用“ NFKC”转换:兼容性分解后再进行规范合成。这将(在可能的情况下)将组合的变音形式(例如Jon提到的U + 301)转换为单个代码点(例如,带有“ U + 301”的“ A”将被转换为“带有急性的拉丁大写字母A”) ,U + 00C1)。
然后,您从头到尾遍历所有字符,将字符串分解为实际字符-如果(仍然)结合了变音符号,则将它们与修改后的字符保持在一起。其结果通常是字符串中实际字符的索引,例如每个字符的位置和长度。
您通常通过使用在上一步中创建的索引来反转这些完整字符的顺序。
然后(再次,可选地)应用另一个Unicode标准化过程,例如NFD(规范分解)。这将使前面提到的“带有急性的拉丁A”变成两个代码点-“拉丁大写A”和“合并急性”。但是,如果您的输入恰好包含一个U + 00C1,它也会将其转换为两个代码点。
然后,您可以将UCS-4代码点的序列编码为所需的编码(UTF-8,UTF-16等)
请注意,Unicode规范化步骤可以/将更改存储字符串所需的代码点数量,因此,如果包括这些代码点,则无法再计划适合原始存储的结果字符串。显然,所得代码点也可能不直接对应于输入代码点。