Я могу заставить мерзавца распознать файл UTF-16 как текст?

Вам уже говорили, что этот подход совершенно неправильный. Но если вам нужно придерживаться этого, вы можете попробовать это:

Ваш тестовый сценарий в новой базе данных (осторожно, если вы уже используете это имя базы данных ...)

USE master;
GO
CREATE DATABASE MyTestDb;
GO
USE MyTestDb;
GO
CREATE TABLE [dbo].[TableA](
  [ID] [int] NOT NULL,
  [Title] [nvarchar](100) NOT NULL,
  [TableBID] [int] NOT NULL
  );
CREATE TABLE [dbo].[TableB](
  [ID] [int] NOT NULL,
  [TableName] [nvarchar](100) NOT NULL
  );
CREATE TABLE [dbo].[ATTR_A](
  [ID] [int] NOT NULL,
  [TableAID] [int] NOT NULL,
  [A21] [nvarchar](100) NOT NULL,
  [A22] [int] NOT NULL
  );
CREATE TABLE [dbo].[ATTR_B](
  [ID] [int] NOT NULL,
  [TableAID] [int] NOT NULL,
  [A21] [nvarchar](100) NOT NULL,
  [A22] [int] NOT NULL
  );
CREATE TABLE [dbo].[ATTR_C](
  [ID] [int] NOT NULL,
  [TableAID] [int] NOT NULL,
  [A21] [nvarchar](100) NOT NULL,
  [A22] [int] NOT NULL
  );
CREATE TABLE [dbo].[ATTR_D](
  [ID] [int] NOT NULL,
  [TableAID] [int] NOT NULL,
  [A21] [nvarchar](100) NOT NULL,
  [A22] [int] NOT NULL
  );  
  INSERT INTO TableA VALUES(1, 'test', 1);
  INSERT INTO TableB VALUES(1, 'ATTR_C');
  INSERT INTO ATTR_C VALUES (1, 1, 'Name', 2019);
  INSERT INTO TableA VALUES(2, 'test2', 2);
  INSERT INTO TableB VALUES (2, 'ATTR_A');
  INSERT INTO ATTR_A VALUES (1, 2, 'Name 2', 2016);
GO

- Я создаю встроенную табличную функцию , где все таблицы атрибутов возвращаются как один набор, используя UNION ALL
- Механизм достаточно умен, чтобы избежать вызова, если параметр не подходит.

CREATE FUNCTION dbo.GetTheRightSet(@SetKey VARCHAR(10))
RETURNS TABLE
AS
RETURN
    SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_A WHERE @SetKey='ATTR_A'
    UNION ALL
    SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_B WHERE @SetKey='ATTR_B'
    UNION ALL
    SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_C WHERE @SetKey='ATTR_C'
    UNION ALL
    SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_D WHERE @SetKey='ATTR_D'
GO

- Вот как это использовать

SELECT TableA.*
      ,TableB.*
      ,TheSet.* 
FROM TableA 
LEFT JOIN TableB ON TableA.TableBID = TableB.ID 
OUTER APPLY dbo.GetTheRightSet(TableB.TableName) TheSet
GO

- Очистить (осторожно с реальными данными)

USE master;
GO
DROP DATABASE MyTestDb;
134
задан Sam Stokes 19 August 2009 в 15:57
поделиться

4 ответа

Если при статической компоновке вы имеете в виду добавление всех объектных файлов (.o) в двоичный файл, это должно работать как динамический материал, если вы создали статическую библиотеку (.a), компоновщик не будет свяжите их внутри, так как только используемые объекты внутри статической библиотеки связаны, и в этом случае ни один из них не используется явно.

Все методы автоматической регистрации зависят от кода времени загрузки и его способов избежать статического фиаско, например, функция который создает объект и возвращает его по запросу.

Но если вам не удастся загрузить, что когда-либо это не сработает, объединение объектных файлов вместе сработает, а также загрузка динамических библиотек, но статические библиотеки никогда не будут компоноваться без явных зависимостей.

и только что обнаружил (для меня) идеальное решение:

$ git config --global diff.tool vimdiff      # or merge.tool to get merging too!
$ git difftool commit1 commit2

git difftool принимает те же аргументы, что и git diff , но запускает программу diff по вашему выбору вместо встроенного GNU diff . Поэтому выберите многобайтовую разницу (в моем случае, vim в режиме сравнения) и просто используйте git difftool вместо git diff .

Найти » difftool "слишком долго печатать? Нет проблем:

$ git config --global alias.dt difftool
$ git dt commit1 commit2

Git Rocks.

Считаете "difftool" слишком длинным для ввода? Нет проблем:

$ git config --global alias.dt difftool
$ git dt commit1 commit2

Git Rocks.

Считаете "difftool" слишком длинным для ввода? Нет проблем:

$ git config --global alias.dt difftool
$ git dt commit1 commit2

Git Rocks.

81
ответ дан 23 November 2019 в 23:56
поделиться

Вы пытались установить .gitattributes для обработки его как текстового файла?

Например:

*.vmc diff

Более подробная информация на http://www.git-scm.com/docs/gitattributes.html .

37
ответ дан 23 November 2019 в 23:56
поделиться

По умолчанию похоже, что git не будет хорошо работать с UTF-16; для такого файла вы должны убедиться, что обработка CRLF не выполняется, но вы хотите, чтобы diff и объединяли для работы как обычный текстовый файл ( это игнорирует, может ли ваш терминал / редактор обрабатывать UTF-16.) ]:

[attr]binary -diff -crlf

Так что мне кажется, что вы можете определить пользовательский атрибут на своем верхнем уровне .gitattributes для utf16 (обратите внимание, что я добавляю слияние здесь, чтобы быть уверенным, что оно обрабатывается как текст):

[attr]utf16 diff merge -crlf

Оттуда вы сможете указать в любом файле .gitattributes что-то вроде:

*.vmc utf16

Также обратите внимание, что вы все равно должны иметь возможность diff файла, даже если git считает, что он двоичный с:

git diff --text

Edit

Этот ответ в основном говорит что GNU diff с UTF-16 или даже UTF-8 работает не очень хорошо. Если вы хотите, чтобы git использовал другой инструмент для просмотра различий (через - ext-diff ), этот ответ предполагает Guiffy .

Но что вам, скорее всего, нужно просто diff файл UTF-16, который содержит только символы ASCII. Чтобы заставить это работать, используйте - ext-diff и следующий скрипт оболочки:

#!/bin/bash
diff <(iconv -f utf-16 -t utf-8 "$1") <(iconv -f utf-16 -t utf-8 "$2")

Обратите внимание, что преобразование в UTF-8 может также работать для слияния, вы просто должны убедиться, что это делается в обоих направлениях.

Что касается вывода на терминал при просмотре различий файла UTF-16: бинарный мусор выбросил на экран. Если git использует GNU diff, это кажется, что GNU diff не с поддержкой Unicode.

GNU diff на самом деле не заботится о Unicode, поэтому, когда вы используете diff --text, он просто diff и выводит текст. Проблема в том, что используемый вами терминал не может обрабатывать испускаемый UTF-16 (в сочетании с метками diff, которые являются символами ASCII).

30
ответ дан 23 November 2019 в 23:56
поделиться

Решением является фильтрация через cmd.exe / c "type% 1" . Встроенная команда cmd type выполняет преобразование, и поэтому вы можете использовать это с возможностью textconv команды git diff, чтобы включить текстовое различие файлов UTF-16 (также должно работать с UTF-8, хотя и не тестировалось).

Цитата из справочной страницы gitattributes:


Выполнение текстовых различий для двоичных файлов

Иногда желательно увидеть разницу для преобразованных в текст версии некоторых двоичных файлов. Например, документ текстового процессора может быть преобразован в текстовое представление ASCII и отображаемый текст. Несмотря на то, что это преобразование теряет некоторую информацию, полученное различие полезно для просмотра человеком (но не может применяться напрямую).

Параметр конфигурации textconv используется для определения программы для выполнения такого преобразования. Программа должна принимать единственный аргумент, имя файла, который нужно преобразовать, и выдавать результирующий текст на стандартный вывод.

Например, чтобы показать различие информации exif файла вместо двоичной информации (при условии, что у вас есть установленный инструмент exif) добавьте следующий раздел в свой файл $ GIT_DIR / config (или файл $ HOME / .gitconfig ):

[diff "jpg"]
        textconv = exif

Решение для mingw32 , Поклонникам cygwin, возможно, придется изменить подход. Проблема заключается в передаче имени файла для преобразования в cmd.exe - он будет использовать косую черту, а cmd предполагает использование разделителей каталогов обратной косой чертой.

Шаг 1:

Создайте сценарий с одним аргументом, который будет выполнять преобразование в стандартный вывод. c: \ path \ to \ some \ script.sh:

#!/bin/bash
SED='s/\//\\\\\\\\/g'
FILE=\`echo $1 | sed -e "$SED"\`
cmd.exe /c "type $FILE"

Шаг 2:

Настройте git, чтобы иметь возможность использовать файл сценария. Внутри вашей конфигурации git ( ~ /.

8
ответ дан 23 November 2019 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: