1. In the older versions of Ada standard, functions can't have side effects, in a sense that they are not allowed to return more than one value (by setting the function's parameter's mode to out). Procedures always allowed to have side effects.
2. Functions can be expression functions which can be set in the code specification or used in expressions. Procedures can be written only in packages' bodies.
3. Procedures can be set to no-return state: that kind of procedure doesn't end in the normal way, but, for example, only by raising an exception.
4. Procedures can be null procedures, empty. That not the same as abstract subprograms from other programming languages.
Also, the difference is, in my opinion, more visible in the safe subset of Ada, SPARK, where still exists the rule which forbids side effects on functions.
I think, there are that same many ways to use Ada strings as C/C++. Ada and UTF-8 works very nice out of the box, it doesn't need any 3rd parties libraries (at least I never needed them and I use both each day :)).
Out of curiosity, what do you mean by "lack of infrastructure"? About 3rd party libraries, that's true, Ada is far behind more popular languages but due to it nice binding capabilities it is not a problem to use C or C++ libraries in the Ada projects.
About comp.lang.ada I can say too much, I don't spend much time there. To be honest I stopped using Usenet many years ago. Many people who can help you with Ada related problems are on Stack Overflow, Reddit or Gitter too. I think list here: https://github.com/ohenley/awesome-ada#Community is the best place to start to ask for help.
And about the language popularity: as for someone who is inside it, probably it looks for me too optimistic. :) But I think in the last few months Ada got a second (small, but second) chance.
2. Functions can be expression functions which can be set in the code specification or used in expressions. Procedures can be written only in packages' bodies.
3. Procedures can be set to no-return state: that kind of procedure doesn't end in the normal way, but, for example, only by raising an exception.
4. Procedures can be null procedures, empty. That not the same as abstract subprograms from other programming languages.
Also, the difference is, in my opinion, more visible in the safe subset of Ada, SPARK, where still exists the rule which forbids side effects on functions.