If you have integers, you can encode or decode strings (simple schemes are enough for this: A = 1, B = 2, etc.). You only need to be able to compare constant strings or compare int. Therefore, there is no fundamental problem.
You work with numbers and write things like
if (n == 1) print "A" if (n == 2) print "B" ...
There may be some practical difficulties. The thing with strings is not that you have characters, but that they are equivalent to very large numbers. Here you need to either access unlimited precision numbers, or some array of fixed numbers or another large data structure. An array of numbers will do for you what a string can do. But if your language is the completion of Turing, it should have a way to easily access a large chunk of memory.
The full text of Turing, limited to 32-bit tape (or where you must specify a new name for each different 32-bit memory space), would be unfortunate, not sure if you could write quine with such a restriction. By the way, it would be interesting to know how you proved that your language was Turing complete if you do not have arrays or a similar structure. The usual method that I usually use is to implement some Turing machine using my language. But for this I need some kind of array to simulate the strip.
This type of coding is basically what GΓΆdel made in him a theorem of incomplete information, to find a way to code logical expressions as integers, and then talk about it.
If you give a few more syntax elements, we could even try to do it (if you have no functions, but only gotos, this will also be a problem, but you can also imitate this). The main problem is that you need to find a way to "compress" your encoded source code. If you have a long string constant, it can help.
kriss source share