ASCII is, as people have pointed out, a 7-bit code, so it can hold only 128 characters. When they added _ and ^ to it in 01967, they had to remove the ← and ↑ characters from ASCII-1963⁂. So there was no space for any of the characters —–“”×÷£°†‡¢§•€, which are absolutely critical even for English. "National variants" of ASCII might allocate space to some of them, or to other characters like ñ which are even more critical to the languages that use them.

If you're interested in how ASCII ended up that way, Tom Jennings wrote an excellent history: https://www.sensitiveresearch.com/Archive/CharCodeHist/index...

Of course, larger character sets that include ASCII as a subset do keep adding symbols: https://www.unicode.org/alloc/Pipeline.html and some programming languages do use non-ASCII symbols: https://docs.raku.org/language/operators

______

⁂ Smalltalk's continued use of ASCII-1963, among other things so that it could use ← as the assignment operator, is the reason that OO programmers got in the habit of using CamelCase, and are still doing so today, despite using a character set containing the underscore, and, typically, programming languages in which underscores are valid characters