Почему printf сообщает об ошибке на всех, кроме трех (ASCII-диапазоне) Unicode Codepoints, но все ли в порядке со всеми остальными?

У меня возникла та же проблема.

⠀ Хост: Ubuntu 14.10 (64-разрядный) ⠀ Гость: Windows 7 (64-разрядная версия)

Даже при включении виртуализации в BIOS хоста загрузка процессора постоянно составляла около 40 -50% в гостевом режиме ожидания.

Что помогло мне в установке гостевого дополнения с поддержкой Direct 3D (вам нужно сделать это в безопасном режиме) и включении кэша ввода-вывода хоста контроллера SATA.

Итак, мои текущие настройки:

Система ⠀ Базовая память: 4096 Мб (общая память хоста 8192 МБ) ⠀ Процессор: 6 ЦП (хоста 6 CPU) ⠀ PAE / NX: включено ⠀ VT-x / AMD-V: включено ⠀ Вложенный пейджинг: включен

Система ⠀ Видеопамять: 128 Mb ⠀3 D Ускорение: 4096 Mb ⠀2 D Ускорение: включено

Работает как очарование! Версия виртуальной коробки: 4.3.18_Ubuntu r96516

2
задан 10 January 2011 в 01:19

27 ответов

Команда printf имеет причины не принимать указатели в этом диапазоне. Если вы посмотрите на код sounce для printf, вы увидите следующий комментарий:

Универсальное имя символа не должно указывать короткий символ символа в диапазоне от 00000000 до 00000020, от 0000007F до 0000009F или от 0000D800 до 0000DFFF включительно. Имя универсального символа не должно обозначать символ в требуемом наборе символов.

Возможно, вы сможете перекомпилировать без этой проверки, но для меня это выглядит очень преднамеренно. Попробуйте вместо этого использовать команду без \ u, например:

( 
for nib1 in {0..9} {A..F}; do 
  for nib0 in {0..9} {A..F}; do
   $(type -P printf) "\00$nib1$nib0"
  done
done 
echo 
)
2
ответ дан 25 May 2018 в 23:34
  • 1
    Мартин, Спасибо, что нашел эту информацию. Да, они заявляют, что это преднамеренно, но не почему. Тайна несколько расплывается, и все же как-то более интригующе. (Re. «Отбрасывание» \ u '.. это побеждает мое намерение, оно просто печатает мою шестнадцатеричную букву' FF 'назад ко мне с' 00 'preended;' 00FF ') .. так что, хотя вы обнаружили очень важный факт, я сейчас в эфире о «почему» за их «не будет» .. .Что так важно в этой проблеме, что они специфически кодируют вокруг нее? ... (и это оставляет меня по-прежнему ищут «легкий» способ преобразования шестнадцатеричного литерала в его символ Unicode CodePoint – Peter.O 10 January 2011 в 07:48
  • 2
    Ну, вы могли просто изменить код и перекомпилировать пакет. Но с другой стороны, я уверен, что эти символы были заблокированы просто потому, что они не видны. – Martin Owens -doctormo- 10 January 2011 в 08:26
  • 3
    Он блокирует весь базовый латинский алфавит . а не просто контролировать символы. Является источником C ++, потому что единственное, что я нашел на нем, - это документ, который упоминает, что эта проблема относится к стандартам C ++: open-std.org/jtc1/sc22/wg21 /docs/papers/2007/n2170.html .. Может быть, это из-за какой-то неясной проблемы с двойной обратной завихренностью. По крайней мере, теперь я знаю, что я могу забыть об этом printf, являющемся простой однонаправленной магазин для печати всего диапазона символов unicode из шестнадцатеричного литерала (в сценарии bash) ... но должно быть что-то, что соответствует счету :) – Peter.O 10 January 2011 в 08:49
  • 4
    Задайте вопрос, я отвечу на него и получаю очки! huzzar. – Martin Owens -doctormo- 10 January 2011 в 09:17

команда printf, и есть причины не принимать charicters в этом диапазоне. Если вы посмотрите на код sounce для функции printf, вы увидите этот комментарий:

универсальное имя персонажа не указано характер короткий идентификатор в диапазоне 00000000 через 00000020, 0000007F через 0000009F, или 0000D800 через 0000DFFF включительно. Универсальное имя персонажа не назначает характера в необходимых набор символов.

Вы могли бы перекомпилировать без чека, но это выглядит очень взвешенно ко мне. Вместо этого попробуйте использовать команду без В \П, например:

( for nib1 in {0..9} {A..F}; do for nib0 in {0..9} {A..F}; do $(type -P printf) "\00$nib1$nib0" done done echo )
2
ответ дан 25 July 2018 в 22:38

Команда printf имеет причины не принимать указатели в этом диапазоне. Если вы посмотрите на код sounce для printf, вы увидите следующий комментарий:

Универсальное имя символа не должно указывать короткий символ символа в диапазоне от 00000000 до 00000020, от 0000007F до 0000009F или от 0000D800 до 0000DFFF включительно. Имя универсального символа не должно обозначать символ в требуемом наборе символов.

Возможно, вы сможете перекомпилировать без этой проверки, но для меня это выглядит очень преднамеренно. Попробуйте вместо этого использовать команду без \ u, например:

( for nib1 in {0..9} {A..F}; do for nib0 in {0..9} {A..F}; do $(type -P printf) "\00$nib1$nib0" done done echo )
2
ответ дан 26 July 2018 в 23:17

команда printf, и есть причины не принимать charicters в этом диапазоне. Если вы посмотрите на код sounce для функции printf, вы увидите этот комментарий:

универсальное имя персонажа не указано характер короткий идентификатор в диапазоне 00000000 через 00000020, 0000007F через 0000009F, или 0000D800 через 0000DFFF включительно. Универсальное имя персонажа не назначает характера в необходимых набор символов.

Вы могли бы перекомпилировать без чека, но это выглядит очень взвешенно ко мне. Вместо этого попробуйте использовать команду без В \П, например:

( for nib1 in {0..9} {A..F}; do for nib0 in {0..9} {A..F}; do $(type -P printf) "\00$nib1$nib0" done done echo )
2
ответ дан 2 August 2018 в 04:04

Команда printf имеет причины не принимать указатели в этом диапазоне. Если вы посмотрите на код sounce для printf, вы увидите следующий комментарий:

Универсальное имя символа не должно указывать короткий символ символа в диапазоне от 00000000 до 00000020, от 0000007F до 0000009F или 0000D800 до 0000DFFF включительно. Имя универсального символа не должно обозначать символ в обязательном наборе символов.

Вы могли бы иметь возможность перекомпилировать без этой проверки, но это выглядит очень преднамеренно для меня , Попробуйте вместо этого использовать команду без \ u, например:

  (для nib1 в {0..9} {A..F}; для nib0 в {0..9  } {A..F}; do $ (type -P printf) "\ 00 $ nib1 $ nib0" done done echo)  
2
ответ дан 4 August 2018 в 20:08

Команда printf имеет причины не принимать указатели в этом диапазоне. Если вы посмотрите на код sounce для printf, вы увидите следующий комментарий:

Универсальное имя символа не должно указывать короткий символ символа в диапазоне от 00000000 до 00000020, от 0000007F до 0000009F или 0000D800 до 0000DFFF включительно. Имя универсального символа не должно обозначать символ в обязательном наборе символов.

Вы могли бы иметь возможность перекомпилировать без этой проверки, но это выглядит очень преднамеренно для меня , Попробуйте вместо этого использовать команду без \ u, например:

  (для nib1 в {0..9} {A..F}; для nib0 в {0..9  } {A..F}; do $ (type -P printf) "\ 00 $ nib1 $ nib0" done done echo)  
2
ответ дан 6 August 2018 в 04:10

Команда printf имеет причины не принимать указатели в этом диапазоне. Если вы посмотрите на код sounce для printf, вы увидите следующий комментарий:

Универсальное имя символа не должно указывать короткий символ символа в диапазоне от 00000000 до 00000020, от 0000007F до 0000009F или 0000D800 до 0000DFFF включительно. Имя универсального символа не должно обозначать символ в обязательном наборе символов.

Вы могли бы иметь возможность перекомпилировать без этой проверки, но это выглядит очень преднамеренно для меня , Попробуйте вместо этого использовать команду без \ u, например:

  (для nib1 в {0..9} {A..F}; для nib0 в {0..9  } {A..F}; do $ (type -P printf) "\ 00 $ nib1 $ nib0" done done echo)  
2
ответ дан 7 August 2018 в 22:09

Команда printf имеет причины не принимать указатели в этом диапазоне. Если вы посмотрите на код sounce для printf, вы увидите следующий комментарий:

Универсальное имя символа не должно указывать короткий символ символа в диапазоне от 00000000 до 00000020, от 0000007F до 0000009F или 0000D800 до 0000DFFF включительно. Имя универсального символа не должно обозначать символ в обязательном наборе символов.

Вы могли бы иметь возможность перекомпилировать без этой проверки, но это выглядит очень преднамеренно для меня , Попробуйте вместо этого использовать команду без \ u, например:

  (для nib1 в {0..9} {A..F}; для nib0 в {0..9  } {A..F}; do $ (type -P printf) "\ 00 $ nib1 $ nib0" done done echo)  
2
ответ дан 10 August 2018 в 10:23

Команда printf имеет причины не принимать указатели в этом диапазоне. Если вы посмотрите на код sounce для printf, вы увидите следующий комментарий:

Универсальное имя символа не должно указывать короткий символ символа в диапазоне от 00000000 до 00000020, от 0000007F до 0000009F или 0000D800 до 0000DFFF включительно. Имя универсального символа не должно обозначать символ в обязательном наборе символов.

Вы могли бы иметь возможность перекомпилировать без этой проверки, но это выглядит очень преднамеренно для меня , Попробуйте вместо этого использовать команду без \ u, например:

  (для nib1 в {0..9} {A..F}; для nib0 в {0..9  } {A..F}; do $ (type -P printf) "\ 00 $ nib1 $ nib0" done done echo)  
2
ответ дан 13 August 2018 в 16:48
  • 1
    Мартин, Спасибо, что нашел эту информацию. Да, они заявляют, что это преднамеренно, но не почему. Тайна несколько расплывается, и все же как-то более интригующе. (Re. «Отбрасывание» \ u '.. это побеждает мое намерение, оно просто печатает мою шестнадцатеричную букву' FF 'назад ко мне с' 00 'preended;' 00FF ') .. так что, хотя вы обнаружили очень важный факт, я сейчас в эфире о «почему» за их «не будет» .. .Что так важно в этой проблеме, что они специфически кодируют вокруг нее? ... (и это оставляет меня по-прежнему ищут «легкий» способ преобразования шестнадцатеричного литерала в его символ Unicode CodePoint – Peter.O 10 January 2011 в 07:48
  • 2
    Хорошо, что вы могли просто изменить код и перекомпилировать пакет. Но с другой стороны, я уверен, что эти символы были заблокированы просто потому, что они не видны. – Martin Owens -doctormo- 10 January 2011 в 08:26
  • 3
    Он блокирует весь базовый латинский алфавит . а не просто контролировать символы. Является источником C ++, потому что единственное, что я нашел на нем, - это документ, который упоминает, что эта проблема относится к стандартам C ++: open-std.org/jtc1/sc22/wg21 /docs/papers/2007/n2170.html .. Возможно, это из-за какой-то неясной проблемы с двойной обратной завихренностью. По крайней мере, теперь я знаю, что я могу забыть об этом printf, являющемся простой одной остановкой магазин для печати всего диапазона символов unicode из шестнадцатеричного литерала (в сценарии bash) ... но должно быть что-то, что соответствует счету :) – Peter.O 10 January 2011 в 08:49
  • 4
    Задайте вопрос, я отвечу на него и получаю очки! huzzar. – Martin Owens -doctormo- 10 January 2011 в 09:17

Три рабочих символа - это три печатных символа ASCII, которые не входят в базовый набор символов C. Причина, по которой эти символы запрещены в C, заключается в том, что компиляторам было бы сложно: им нужно было выполнить интерполяцию \u до лексического анализа, который, как я думаю, сломался бы в нескольких угловых случаях и был бы непрактичным во многих компиляторах в любом случае (потому что символы за пределами базового набора должны быть разрешены только в нескольких местах).

Наличие одинаковых запрещенных символов не имеет смысла в утилите оболочки. Я подозреваю, что это ошибка, и $, @ и ` тоже не должны работать. Причина не в том, чтобы их поддерживать, так это упростить анализ строк. Например, если вы хотите определить, что нет C , вы можете проверить, что строка не содержит ', и не беспокоиться об этом, содержащем \u002a.

Рассмотрите возможность использования recode, как это предлагается в руководстве GNU coreutils или (более переносимом на практике) Perl или python.

3
ответ дан 25 May 2018 в 23:34
  • 1
    Жиль, спасибо за объяснение ... Так что кажется, что некоторые "тело" (возможно, группа стандартов C) пыталась заблокировать кодировщики от использования этих заблокированных «кодировок ...» в самом исходном коде. Хорошо! .. но я не вижу, как это, в любом случае, связано с использованием printf во время выполнения, которое не имеет никакого отношения к компилятору и только когда-либо связано с пользователем запущенного приложения ... Я это неважно, но это не имеет значения, потому что теперь я точно знаю, что происходит ... и я обнаружил некоторые интересные инструменты на этом пути; например. перекодировать; который имеет 0x1234 "поверхность", но нет "U1234" – Peter.O 11 January 2011 в 08:27
(for nib1 in {0..9} {A..F}; do 
  for nib0 in {0..9} {A..F}; do
   $(type -P printf) "\x$nib1$nib0"
  done
done 
echo )

prints (ручной формат)

            


                    
   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
 @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ 
 ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  
 � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
 � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
 � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
 � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

Обратите внимание, что некоторые управляющие коды «character» «работают», т.е. HT, VT, LF. и др.

-1
ответ дан 25 May 2018 в 23:34
  • 1
    Нотация \x предназначена только для диапазона 00-FF (т. Е. Только для одного байта). Он имеет "гарантированный" эквивалентность значений кодировки Unicode только в диапазоне ASCII 00-7F. Меня особенно интересовала нотация Unicode \u, которая предназначена для Unicode Codepoints 0000-FFFF. – Peter.O 14 March 2013 в 00:55
(for nib1 in {0..9} {A..F}; do for nib0 in {0..9} {A..F}; do $(type -P printf) "\x$nib1$nib0" done done echo )

prints (ручной формат)

                    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

Обратите внимание, что некоторые управляющие коды «character» «работают», т.е. HT, VT, LF. и др.

-1
ответ дан 25 July 2018 в 22:38
  • 1
    Обозначение \x предназначен только для диапазона 00-FF (т. е. только один байт). Он имеет "гарантированные" эквивалентность значений кодовых точек Юникода только в диапазоне ASCII 00-7F. Я был особенно заинтересован в Юникоде [F4] для обозначения которых предназначен для Unicode коды 0000-FFFF. – Peter.O 14 March 2013 в 00:55

Три рабочих символа - это три печатных символа ASCII, которые не входят в базовый набор символов C. Причина, по которой эти символы запрещены в C, заключается в том, что компиляторам было бы сложно: им нужно было выполнить интерполяцию \u до лексического анализа, который, как я думаю, сломался бы в нескольких угловых случаях и был бы непрактичным во многих компиляторах в любом случае (потому что символы за пределами базового набора должны быть разрешены только в нескольких местах).

Наличие одинаковых запрещенных символов не имеет смысла в утилите оболочки. Я подозреваю, что это ошибка, и $, @ и ` тоже не должны работать. Причина не в том, чтобы их поддерживать, так это упростить анализ строк. Например, если вы хотите определить, что нет C , вы можете проверить, что строка не содержит ', и не беспокоиться об этом, содержащем \u002a.

Рассмотрите возможность использования recode, как это предлагается в руководстве GNU coreutils или (более переносимом на практике) Perl или python.

3
ответ дан 25 July 2018 в 22:38
  • 1
    Жиль, спасибо за объяснение ... Так что кажется, что некоторые "тело" (возможно, группа стандартов C) пыталась заблокировать кодировщики от использования этих заблокированных «кодировок ...» в самом исходном коде. Хорошо! .. но я не вижу, как это, в любом случае, связано с использованием printf во время выполнения, которое не имеет никакого отношения к компилятору и только когда-либо связано с пользователем запущенного приложения ... Я это неважно, но это не имеет значения, потому что теперь я точно знаю, что происходит ... и я обнаружил некоторые интересные инструменты на этом пути; например. перекодировать; который имеет 0x1234 "поверхность", но нет "U1234" – Peter.O 11 January 2011 в 08:27
(for nib1 in {0..9} {A..F}; do for nib0 in {0..9} {A..F}; do $(type -P printf) "\x$nib1$nib0" done done echo )

prints (ручной формат)

                    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

Обратите внимание, что некоторые управляющие коды «character» «работают», т.е. HT, VT, LF. и др.

-1
ответ дан 26 July 2018 в 23:17
  • 1
    Нотация \x предназначена только для диапазона 00-FF (т. Е. Только для одного байта). Он имеет "гарантированный" эквивалентность значений кодировки Unicode только в диапазоне ASCII 00-7F. Меня особенно интересовала нотация Unicode \u, которая предназначена для Unicode Codepoints 0000-FFFF. – Peter.O 14 March 2013 в 00:55

Три рабочих символа - это три печатных символа ASCII, которые не входят в базовый набор символов C. Причина, по которой эти символы запрещены в C, заключается в том, что компиляторам было бы сложно: им нужно было выполнить интерполяцию \u до лексического анализа, который, как я думаю, сломался бы в нескольких угловых случаях и был бы непрактичным во многих компиляторах в любом случае (потому что символы за пределами базового набора должны быть разрешены только в нескольких местах).

Наличие одинаковых запрещенных символов не имеет смысла в утилите оболочки. Я подозреваю, что это ошибка, и $, @ и ` тоже не должны работать. Причина не в том, чтобы их поддерживать, так это упростить анализ строк. Например, если вы хотите определить, что нет C , вы можете проверить, что строка не содержит ', и не беспокоиться об этом, содержащем \u002a.

Рассмотрите возможность использования recode, как это предлагается в руководстве GNU coreutils или (более переносимом на практике) Perl или python.

3
ответ дан 26 July 2018 в 23:17
  • 1
    Жиль, спасибо за пояснение... так и кажется, что некоторые "тела" (с групповых стандартов, может быть) пытался подавлять кодеров с помощью этих заблокированных "у.."кодировки в исходном коде.. отлично! .. но я не вижу, как это, в любом случае, связана с Runtime использование функций printf, которая не имеет ничего общего с компилятором, и только когда пользователь работает ок... я озадачена этим.. но это не важно, ведь теперь я примерно знаю, что происходит... и я обнаружил некоторые интересные инструменты на этом пути, например. перекодирование; имеет 0x1234 "поверхности", но не "U1234" – Peter.O 11 January 2011 в 08:27
(for nib1 in {0..9} {A..F}; do for nib0 in {0..9} {A..F}; do $(type -P printf) "\x$nib1$nib0" done done echo )

prints (ручной формат)

                    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

Обратите внимание, что некоторые управляющие коды «character» «работают», т.е. HT, VT, LF. и др.

-1
ответ дан 2 August 2018 в 04:04
  • 1
    Нотация \x предназначена только для диапазона 00-FF (т. Е. Только для одного байта). Он имеет "гарантированный" эквивалентность значений кодировки Unicode только в диапазоне ASCII 00-7F. Меня особенно интересовала нотация Unicode \u, которая предназначена для Unicode Codepoints 0000-FFFF. – Peter.O 14 March 2013 в 00:55

Три рабочих символа - это три печатных символа ASCII, которые не входят в базовый набор символов C. Причина, по которой эти символы запрещены в C, заключается в том, что компиляторам было бы сложно: им нужно было выполнить интерполяцию \u до лексического анализа, который, как я думаю, сломался бы в нескольких угловых случаях и был бы непрактичным во многих компиляторах в любом случае (потому что символы за пределами базового набора должны быть разрешены только в нескольких местах).

Наличие одинаковых запрещенных символов не имеет смысла в утилите оболочки. Я подозреваю, что это ошибка, и $, @ и ` тоже не должны работать. Причина не в том, чтобы их поддерживать, так это упростить анализ строк. Например, если вы хотите определить, что нет C , вы можете проверить, что строка не содержит ', и не беспокоиться об этом, содержащем \u002a.

Рассмотрите возможность использования recode, как это предлагается в руководстве GNU coreutils или (более переносимом на практике) Perl или python.

3
ответ дан 2 August 2018 в 04:04
  • 1
    Жиль, спасибо за пояснение... так и кажется, что некоторые "тела" (с групповых стандартов, может быть) пытался подавлять кодеров с помощью этих заблокированных "у.."кодировки в исходном коде.. отлично! .. но я не вижу, как это, в любом случае, связана с Runtime использование функций printf, которая не имеет ничего общего с компилятором, и только когда пользователь работает ок... я озадачена этим.. но это не важно, ведь теперь я примерно знаю, что происходит... и я обнаружил некоторые интересные инструменты на этом пути, например. перекодирование; имеет 0x1234 "поверхности", но не "U1234" – Peter.O 11 January 2011 в 08:27

Три рабочих символа - это три печатных символа ASCII, которые не находятся в базовом наборе символов C . Причина, по которой эти символы запрещены в C, заключается в том, что компиляторам было бы сложно: им нужно было выполнить интерполяцию \ u до лексического анализа, который, как я думаю, разбился бы на несколько угловых случаев и во многих компиляторах было бы непрактично (потому что символы за пределами базового набора должны быть разрешены только в нескольких местах).

Наличие одинаковых запрещенных символов не имеет смысла в утилите оболочки. Я подозреваю, что это ошибка, а $ , @ и ` тоже не должны работать. Причина не в том, чтобы их поддерживать, так это упростить анализ строк. Например, если вы хотите определить, что в строке, которую вы собираетесь ввести в запрос базы данных , нет специального символа , вы можете проверить, что строка не содержит '[ ! d8], и не беспокоиться об этом, содержащем \ u002a .

Рассмотрим использование recode , как предложено в руководстве GNU coreutils или (более переносимый на практике) Perl или python.

3
ответ дан 4 August 2018 в 20:08
  (для nib1 в {0..9} {A..F}; do для nib0 в {0..9} {A..F}; do $ (type -P printf) "\  x $ nib1 $ nib0 "done done echo"  

prints (ручной формат отрегулирован)

 ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  !  "# $% & amp; '() * +, -. / 0 1 2 3 4 5 6 7 8 9:; & lt; = & gt; @ ABCDEFGHIJKLMNOPQRSTU VWXYZ [\] ^ _` abcdefghijklmnopqrstu vwxyz {|} ~?                                                                                                                                                                                                                                   

Обратите внимание, что некоторые «символьные» управляющие коды «работают», т. Е. HT , VT, LF и т. Д.

-1
ответ дан 4 August 2018 в 20:08

Три рабочих символа - это три печатных символа ASCII, которые не находятся в базовом наборе символов C . Причина, по которой эти символы запрещены в C, заключается в том, что компиляторам было бы сложно: им нужно было выполнить интерполяцию \ u до лексического анализа, который, как я думаю, разбился бы на несколько угловых случаев и во многих компиляторах было бы непрактично (потому что символы за пределами базового набора должны быть разрешены только в нескольких местах).

Наличие одинаковых запрещенных символов не имеет смысла в утилите оболочки. Я подозреваю, что это ошибка, а $ , @ и ` тоже не должны работать. Причина не в том, чтобы их поддерживать, так это упростить анализ строк. Например, если вы хотите определить, что в строке, которую вы собираетесь ввести в запрос базы данных , нет специального символа , вы можете проверить, что строка не содержит '[ ! d8], и не беспокоиться об этом, содержащем \ u002a .

Рассмотрим использование recode , как предложено в руководстве GNU coreutils или (более переносимый на практике) Perl или python.

3
ответ дан 6 August 2018 в 04:10
  (для nib1 в {0..9} {A..F}; do для nib0 в {0..9} {A..F}; do $ (type -P printf) "\  x $ nib1 $ nib0 "done done echo"  

prints (ручной формат отрегулирован)

 ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  !  "# $% & amp; '() * +, -. / 0 1 2 3 4 5 6 7 8 9:; & lt; = & gt; @ ABCDEFGHIJKLMNOPQRSTU VWXYZ [\] ^ _` abcdefghijklmnopqrstu vwxyz {|} ~?                                                                                                                                                                                                                                   

Обратите внимание, что некоторые «символьные» управляющие коды «работают», т. Е. HT , VT, LF и т. Д.

-1
ответ дан 6 August 2018 в 04:10

Три рабочих символа - это три печатных символа ASCII, которые не находятся в базовом наборе символов C . Причина, по которой эти символы запрещены в C, заключается в том, что компиляторам было бы сложно: им нужно было выполнить интерполяцию \ u до лексического анализа, который, как я думаю, разбился бы на несколько угловых случаев и во многих компиляторах было бы непрактично (потому что символы за пределами базового набора должны быть разрешены только в нескольких местах).

Наличие одинаковых запрещенных символов не имеет смысла в утилите оболочки. Я подозреваю, что это ошибка, а $ , @ и ` тоже не должны работать. Причина не в том, чтобы их поддерживать, так это упростить анализ строк. Например, если вы хотите определить, что в строке, которую вы собираетесь ввести в запрос базы данных , нет специального символа , вы можете проверить, что строка не содержит '[ ! d8], и не беспокоиться об этом, содержащем \ u002a .

Рассмотрим использование recode , как предложено в руководстве GNU coreutils или (более переносимый на практике) Perl или python.

3
ответ дан 7 August 2018 в 22:09
  (для nib1 в {0..9} {A..F}; do для nib0 в {0..9} {A..F}; do $ (type -P printf) "\  x $ nib1 $ nib0 "done done echo"  

prints (ручной формат отрегулирован)

 ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  !  "# $% & amp; '() * +, -. / 0 1 2 3 4 5 6 7 8 9:; & lt; = & gt; @ ABCDEFGHIJKLMNOPQRSTU VWXYZ [\] ^ _` abcdefghijklmnopqrstu vwxyz {|} ~?                                                                                                                                                                                                                                   

Обратите внимание, что некоторые «символьные» управляющие коды «работают», т. Е. HT , VT, LF и т. Д.

-1
ответ дан 7 August 2018 в 22:09

Три рабочих символа - это три печатных символа ASCII, которые не находятся в базовом наборе символов C . Причина, по которой эти символы запрещены в C, заключается в том, что компиляторам было бы сложно: им нужно было выполнить интерполяцию \ u до лексического анализа, который, как я думаю, разбился бы на несколько угловых случаев и во многих компиляторах было бы непрактично (потому что символы за пределами базового набора должны быть разрешены только в нескольких местах).

Наличие одинаковых запрещенных символов не имеет смысла в утилите оболочки. Я подозреваю, что это ошибка, а $ , @ и ` тоже не должны работать. Причина не в том, чтобы их поддерживать, так это упростить анализ строк. Например, если вы хотите определить, что в строке, которую вы собираетесь ввести в запрос базы данных , нет специального символа , вы можете проверить, что строка не содержит '[ ! d8], и не беспокоиться об этом, содержащем \ u002a .

Рассмотрим использование recode , как предложено в руководстве GNU coreutils или (более переносимый на практике) Perl или python.

3
ответ дан 10 August 2018 в 10:23
  (для nib1 в {0..9} {A..F}; do для nib0 в {0..9} {A..F}; do $ (type -P printf) "\  x $ nib1 $ nib0 "done done echo"  

prints (ручной формат отрегулирован)

 ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  !  "# $% & amp; '() * +, -. / 0 1 2 3 4 5 6 7 8 9:; & lt; = & gt; @ ABCDEFGHIJKLMNOPQRSTU VWXYZ [\] ^ _` abcdefghijklmnopqrstu vwxyz {|} ~?                                                                                                                                                                                                                                   

Обратите внимание, что некоторые «символьные» управляющие коды «работают», т. Е. HT , VT, LF и т. Д.

-1
ответ дан 10 August 2018 в 10:23

Три рабочих символа - это три печатных символа ASCII, которые не находятся в базовом наборе символов C . Причина, по которой эти символы запрещены в C, заключается в том, что компиляторам было бы сложно: им нужно было выполнить интерполяцию \ u до лексического анализа, который, как я думаю, разбился бы на несколько угловых случаев и во многих компиляторах было бы непрактично (потому что символы за пределами базового набора должны быть разрешены только в нескольких местах).

Наличие одинаковых запрещенных символов не имеет смысла в утилите оболочки. Я подозреваю, что это ошибка, а $ , @ и ` тоже не должны работать. Причина не в том, чтобы их поддерживать, так это упростить анализ строк. Например, если вы хотите определить, что в строке, которую вы собираетесь ввести в запрос базы данных , нет специального символа , вы можете проверить, что строка не содержит '[ ! d8], и не беспокоиться об этом, содержащем \ u002a .

Рассмотрим использование recode , как предложено в руководстве GNU coreutils или (более переносимый на практике) Perl или python.

3
ответ дан 13 August 2018 в 16:48
  • 1
    Жиль, спасибо за объяснение ... Так что кажется, что некоторые "тело" (возможно, группа стандартов C) пыталась заблокировать кодировщики от использования этих заблокированных «кодировок ...» в самом исходном коде. Хорошо! .. но я не вижу, как это, в любом случае, связано с использованием printf во время выполнения, которое не имеет никакого отношения к компилятору и только когда-либо связано с пользователем запущенного приложения ... Я это неважно, но это не имеет значения, потому что теперь я точно знаю, что происходит ... и я обнаружил некоторые интересные инструменты на этом пути; например. перекодировать; который имеет 0x1234 "поверхность", но нет "U1234" – Peter.O 11 January 2011 в 08:27
  (для nib1 в {0..9} {A..F}; do для nib0 в {0..9} {A..F}; do $ (type -P printf) "\  x $ nib1 $ nib0 "done done echo"  

prints (ручной формат отрегулирован)

 ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  !  "# $% & amp; '() * +, -. / 0 1 2 3 4 5 6 7 8 9:; & lt; = & gt; @ ABCDEFGHIJKLMNOPQRSTU VWXYZ [\] ^ _` abcdefghijklmnopqrstu vwxyz {|} ~?                                                                                                                                                                                                                                   

Обратите внимание, что некоторые «символьные» управляющие коды «работают», т. Е. HT , VT, LF и т. Д.

-1
ответ дан 13 August 2018 в 16:48
  • 1
    Обозначение \ x обслуживает только диапазон 00-FF (т. Е. Только для одного байта). Он имеет "гарантированный" эквивалентность кодовых значений Unicode только в диапазоне ASCII 00-7F . Меня особенно интересовала нотация Unicode \ u , которая обслуживает Unicode Codepoints 0000-FFFF . – Peter.O 14 March 2013 в 00:55

Другие вопросы по тегам:

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