Хитрость заключается в том, чтобы думать в терминах символов , а не байтов .Это разные вещи.Кодировки - это способы представления символов в виде байтовых последовательностей (внутренне Tcl действительно довольно сложный, но вам не нужно об этом беспокоиться, если вы не разрабатываете саму реализацию Tcl; достаточно сказать, что это Unicode).Таким образом, когда вы используете:
encoding convertto utf-8 "Kátai-Pál"
Вы берете последовательность символов и запрашиваете последовательность байтов (по одному на результат символ), которая является кодировкой этих символов взаданная кодировка (UTF-8).
Вам необходимо получить уровень интеграции базы данных, чтобы понять, какую кодировку использует база данных, чтобы он мог преобразовываться обратно в символы для вас (вы можете только когда-либо общатьсяиспользование байтов, все остальное - просто упрощение).Это может произойти двумя способами: либо информация передается правильно (с помощью метаданных или определенного соглашения), либо обе стороны делают предположения, которые время от времени остаются неприкрепленными.Похоже, что именно это и происходит, увы.
Если вы не можете справиться с этим другим способом, вы можете взять байты, полученные из слоя базы данных, и преобразовать в символы:
encoding convertfrom $theEncoding $theBytes
Выяснить, что должно быть $theEncoding
, в общем, очень сложно, но, похоже, это utf-8
для вас.Как только у вас появятся символы, Tcl / Tk сможет правильно их отображать;он знает, как правильно передать их в кишки графического интерфейса платформы.(А в сценариях, которые вы на самом деле пишете, лучше всего заменять символы, не входящие в ASCII, на экранированные символы \uXXXX
, потому что платформы не договариваются о том, какую кодировку использовать для сценариев. Увы.)