Как "вырезать и вставить" влияет на кодировку символов и что может пойти не так?
У меня есть документ A в кодировке A, отображаемый в инструменте A, и документ B в кодировке B, отображаемый в инструменте B. Если я вырезал и вставил (часть) B в A, что может быть результирующей кодировкой символов? Я понимаю, что это зависит от инструмента A и инструмента B, а также от информации, хранящейся в буфере вставки (которая предположительно может содержать кодировку?) И операционной системы.
Что должны делать качественные инструменты? и на практике, сколько из общих инструментов (например, Word, TextPad, различные IDE и т. д.) работают хорошо?
4 ответа
Прежде всего, внутреннее представление текста текстовым редактором не имеет никакого отношения к тому, как текст кодируется (сериализуется) при сохранении файла. Таким образом, документ не находится в кодировке; это последовательность абстрактных символов. Когда документ сохраняется в файл (или передается по сети), он кодируется.
Каждое приложение решает, что оно помещает в буфер обмена. Как правило, приложение для Windows, которое знает, что оно делает, помещает в буфер обмена несколько различных представлений. Когда вы вставляете в другое приложение, приложение будет искать представление, которое лучше всего соответствует его потребностям.
В вашем случае текстовый редактор (который знает, что он делает) поместит Unicode-представление выбранной строки в буфер обмена (где Unicode, в Windows, обычно перемещается как UTF-16, но это не важно). При вставке в другое приложение оно вставит эту последовательность символов Unicode в документ в точке выбора.
Существует приложение, которое называется ClipSpy и которое поможет вам увидеть то, о чем я говорю, в интерактивном режиме.
Когда я изучал нормализацию Unicode , я заметил следующее поведение : при копировании канонически разложенной строки (NFD) в Firefox в macOS 10.15.7 строка нормализуется до NFC при вставке ее в Chrome. Что странно, так это то, что вставка влияет на содержимое буфера обмена: при повторной вставке строки в Firefox она также канонически компонуется там. Если я не вставлю его куда-нибудь еще, прежде чем снова вставить в Firefox, форма NFD сохранится. Интересно, что проблема не возникает в другом направлении: при копировании канонически разложенной строки в Chrome она вставляется в форме NFD везде, где я могу сказать. Я пришел к выводу, что Firefox хранит текст в буфере обмена не так, как другие приложения. Один из способов поиграть с этим самостоятельно - скопировать
'mañana' === 'mañana'
в вашу консоль JavaScript. Оператор возвращает false, если форма NFD строки справа сохранилась после копирования и вставки.
Это очень хороший вопрос. Когда вы копируете / вставляете, именно то, что копируется / вставляется - СИМВОЛЫ или БАЙТЫ?. А если БАЙТЫ, то в какой они кодировке?
Судя по ответам, можно сказать, что ответ "зависит от обстоятельств". Различные программы помещают в буфер обмена разные вещи, иногда размещая несколько представлений.
Затем программа вставки должна выбрать лучший и "сделать с ним правильные вещи".
После обращения с @Kaspar Etter я провел небольшое тестирование. Вот что я нашел:
Копировать из и вставить в:
Firefox:
от Firefox к Firefox: нормализация НЕТ
Другие приложения к Firefox: нормализация НЕТ
Firefox к другим приложениям: нормализация
Даже если мы используем AppleScript, JXA или Python для прямого чтения SystemClipboard, содержащего текст, скопированный из Firefox, текст все равно нормализуется. Поскольку копирование и вставка из Firefox в Firefox не требует нормализации, Firefox, вероятно, не нормализует текст в процессе копирования. Я понятия не имею, когда произойдет нормализация.
Safari (MacOS, не iOS):
переход из Safari в Safari: нормализация
из других приложений в Safari: нормализация
из Safari в другие приложения: нормализация НЕТ
Для Safari (MacOS) нормализация также происходит, по крайней мере, на Canvas от instructure.com. В заполняемых вопросах классических викторин, когда учащиеся вводили слова на иврите в викторинах и нажимали «отправить», ввод был нормализован, а ключ ответа — нет. Однако в новых викторинах нормализуются как ввод, так и ключ ответа. Это загадка для меня.
Chrome:
от Chrome к Chrome: нормализация НЕТ
Другие приложения к Chrome: нормализация НЕТ (переопределяет Firefox)
От Chrome к другим приложениям: нормализация НЕТ (переопределяется Safari)
Вывод: Firefox и Safari ведут себя противоположным образом. Chrome ведет себя нормально и последовательно (за исключением случаев, когда Firefox и Safari переопределяют его).