A stray "j" ruined my evening

(napkins.mtmn.name)

67 points | by birdculture 5 days ago

9 comments

  • Cyykratahk 1 day ago
    A stray "J" I encountered years ago: a certain client's support tickets would often end with a single "J", which was a little confusing as it was not one of their name initials. After a brief investigation, the original email source contained this:

        <font face="Wingdings">J</font>
    
    Which renders as a smiley face.
    • TRiG_Ireland 1 day ago
      On seeing just the title, before reading the article, I assumed it was about the Wingdings J.
    • geerlingguy 1 day ago
      Seemed to be a common occurrence from Microsoft Outlook users.
    • sevenseacat 1 day ago
      I remember discovering this in about 2010, and thought it was hilarious
  • mike_hock 1 day ago
    > but in ANSI newline delimiter is translated as "j"

    ?

    • ralferoo 1 day ago
      \n is ^J (ctrl-J) so there's some logic there, but I wonder if something has been lost in the message. I'd guess it either displays ^J or an inverse-colour J, rather than just a plain lowercase j.

      Also possible that the j is a red herring and just some random character that's always there. Pasting a URL containing a newline into most browsers just truncates it at the newline, regardless of how much text is after. I only know this from occasionally copying links from a terminal window where the copy somehow added newlines every 80 characters (even though copying this way normally works fine). I'd have to copy the URL with newlines into a text editor, remove the new lines and copy again to be able to paste it.

      • rgoulter 1 day ago
        > \n is ^J (ctrl-J) so there's some logic there

        The same 'j' as vi uses for 'hjkl'. https://vi.stackexchange.com/questions/42426/why-did-vi-use-...

        • microgpt 1 day ago
          also the same 'j' found in words like 'jujuism', 'jejunities', and 'bejeezus', also by a magical coincidence the same one in most Latin fonts, and even some random text strings such as 'pj$4'

          But I suppose you're saying ASCII 10 was chosen as newly because it aligns with the down arrow on keyboards of the time. Maybe.

          • kps 22 hours ago
            Other way around. ASCII classified control characters into blocks and newline ended up a bit-flip away from J, so the ADM-3A printed ‘­↓’ on the ‘­J’ key.
            • Joker_vD 17 hours ago
              Yes, and ADM-3A also had "↑" on the "K" key, because \013 is vertical tabulation (VT), and "→" on the "L" because \014 is form feed (FF). It all makes perfect sense.

              If terminfo database is to be believed, quite a lot of other terminals reused this control sequences too, for some reason.

              • kps 14 hours ago
                In the era when video terminals were new I have to guess that K and L were just plausibly related enough to justify using them for additional cursor motions, after H and J fit exactly.
          • rgoulter 22 hours ago
            > I suppose you're saying ASCII 10 was chosen as newly because it aligns with the down arrow on keyboards of the time. Maybe.

            The linked StackExchange has it as:

            > What character was used for what control code was mostly a matter of bitwise arithmetics. LF is ^J because J happens to be at the corresponding location in the corresponding column of the table (+ 64 in decimal)

            • microgpt 21 hours ago
              and did they choose that code because the J key had a down arrow printed on it?
        • snarkconjecture 23 hours ago
          No, it's ^J because `J` is 0x4A in ASCII and `\n` is 0x0A, just as `I` is 0x49 and `\t` (tab, ^I) is 0x09.

          In the stone age, pressing CTRL flipped that bit, so ^J is literally "ctrl-J".

          • kps 22 hours ago
            You're saying the same thing. vi uses ‘j’ because the ADM-3A printed ‘­­↓’ on the ‘­J’ key because Control-J is newline because the code is J with a bit flipped because bit-flipping was practical on an electromechanical teletype.
      • randallsquared 1 day ago
        Some tool or library is interpreting the newline as two characters (as you note), and then a subsequent step is removing unprintable characters. Things like this used to frequently happen in shells, Perl, PHP, and so on.
      • thaumasiotes 1 day ago
        > \n is ^J (ctrl-J) so there's some logic there

        Specifically, J is the 10th letter of the alphabet and therefore ctrl-J is code for ascii 10. Same reason ctrl-D sends EOF and ctrl-I sends tab.

        • mike_hock 1 day ago
          Yes, but piping output containing newlines into wl-copy does not result in j's in the clipboard.
    • gucci-on-fleek 1 day ago
      This comes up fairly often in TeX, where you can use ^^J to insert a newline character [0]. For example, the following code:

        \message{before ^^J after}
      
      prints the following message:

        before 
        after
      
      This is common in other old software too [1] [2], but TeX is where I see it the most often these days.

      [0]: https://tex.stackexchange.com/a/64848/270600

      [1]: https://superuser.com/q/212874

      [2]: https://en.wikipedia.org/wiki/Caret_notation

    • raldi 1 day ago
      Yeah, I don't understand this. What broken tool is turning newlines into j?
    • zahlman 21 hours ago
      I thought it was a strange way to express the problem, too. OP didn't really explain where or how the clipboard text was getting pasted in order to reproduce the issue.
    • fsckboy 22 hours ago
      the ANSI escape sequences for screen erasing start with ESC and end in J. When you display a string on a screen including a newline at the end of it, you need to erase to the end of the line on the screen so you don't leave predecessor garbage which would be confusing.

      That's how the J got inserted, then whatever is processing this is swallowing the rest of the escape sequence but leaving the J. The fix is there, take the J with the rest of the escape sequence at whatever layer is doing this.

        ESC[J   erase in display (same as ESC[0J)
        ESC[0J  erase from cursor until end of screen
        ESC[1J  erase from cursor to beginning of screen
        ESC[2J  erase entire screen
        ESC[3J  erase saved lines
      
      ASCII and then ANSI were invented as in-band communications and terminal control protocols, not "file formats". You thread filters together like beads on a string, where ASCII is somebody's job, and ANSI is somebody's job, and then the rendered text is presented to the user.

      unix is ingenious how it has accomodated changes and conflicting ideas, incorporating the new squoze next to the old, like UTF-8 because the same people did that. It's not perfect, but it proved "worse is better" because it for a long time it outcompeted its alternatives and never became bloated and overburdened by bureaucratic committee ideas.

      however today's developers did not "come up" in the same culture of apprenticeship learning so a lot of the clever subtlety has been lost and now worse is starting to be worse, and guess what, there is no better.

  • baruchel 1 day ago
  • zelon88 23 hours ago
    If it's any consolation, the other day I spent 3 hours diagnosing a homebrew circuit board for no signal and finally realized the Raspberry Pi sending the signal had a dead GPIO pin.
  • meindnoch 1 day ago
    So this is a bug in that Signal TUI he was using? I.e. it mangles newlines in pasted text.
    • neonz80 1 day ago
      Impossible, Signal TUI is written in Rust.
      • irishcoffee 1 day ago
        I can’t tell if this is sarcasm or not. I chuckled either way.
  • benj111 1 day ago
    I like how -j fixed the stray j problem....
    • rav 1 day ago
      Today I learned that jq -Rrj is a shorter command line for doing the same as tr -d '\n'.
      • stouset 1 day ago
        IIRC you don’t even need the -r flag since -j incorporates its behavior (minus newlines).
  • cozzyd 22 hours ago
    As a vim user, stray J's are a fact of life.
  • weare138 1 day ago
    I was poking around with this and I noticed wl-copy has an option to trim newlines. Maybe that's why they added the option but I'm leaning towards gurk being the culprit. wl-copy itself seems to handle newlines ok, at least for me. This works as expected:

      echo -e "test\n" | wl-copy
    
      wl-paste
  • Getchowned 22 hours ago
    [dead]